- var_dump: documentation ( source)
- ctype_space: documentation ( source)
<?php
function parseSearchTerms($queryStr) {
$searchTerms = [
'canHave' => [],
'mustHave' => [],
'cannotHave' => []
];
$keyword = '';
$quoted = false;
$mod = null;
$escaped = false;
$spaced = true;
for($i=0,$l=strlen($queryStr);$i<$l;$i++) {
$char = $queryStr[$i];
if(ctype_space($char)) {
$char = ' ';
}
switch($char) {
case ' ':
if($quoted || !$spaced) {
$keyword .= $char;
$spaced = true;
}
else if(!$quoted && !empty($keyword)) {
if(is_null($mod)) {
$searchTerms['canHave'][] = $keyword;
}
else {
if($mod == '+') {
$searchTerms['mustHave'][] = $keyword;
}
else if($mod == '-') {
$searchTerms['cannotHave'][] = $keyword;
}
}
$keyword = '';
}
echo $keyword . PHP_EOL;
var_dump($quoted);
var_dump($spaced);
var_dump($mod);
echo PHP_EOL;
break;
case '"':
if(!$escaped) {
if($quoted) {
if(is_null($mod)) {
$searchTerms['canHave'][] = $keyword;
}
else {
if($mod == '+') {
$searchTerms['mustHave'][] = $keyword;
}
else if($mod == '-') {
$searchTerms['cannotHave'][] = $keyword;
}
}
$keyword = '';
$quoted = false;
}
}
break;
case '+':
case '-':
if($spaced) {
$mod = $char;
$spaced = false;
}
else {
$mod = null;
$keyword .= $char;
$spaced = false;
}
break;
default:
$keyword .= $char;
$spaced = false;
break;
}
}
if(!is_null($mod)) {
if($mod == '+') {
$searchTerms['mustHave'][] = $keyword;
}
else if($mod == '-') {
$searchTerms['cannotHave'][] = $keyword;
}
}
return $searchTerms;
}
var_dump(parseSearchTerms('+here are -no some "search terms"'));