Есть ли простой способ проанализировать строку для поисковых запросов, включая отрицательные термины?
'this -that "the other thing" -"but not this" "-positive"'
изменится на
array( "positive" => array( "this", "the other thing", "-positive" ), "negative" => array( "that", "but not this" ) )
поэтому эти термины могут использоваться для поиска.
Приведенный ниже код проанализирует вашу строку запроса и разделит ее на положительные и отрицательные условия поиска.
// parse the query string $query = 'this -that "-that" "the other thing" -"but not this" '; preg_match_all('/-*"[^"]+"|\S+/', $query, $matches); // sort the terms $terms = array( 'positive' => array(), 'negative' => array(), ); foreach ($matches[0] as $match) { if ('-' == $match[0]) { $terms['negative'][] = trim(ltrim($match, '-'), '"'); } else { $terms['positive'][] = trim($match, '"'); } } print_r($terms);
Array ( [positive] => Array ( [0] => this [1] => -that [2] => the other thing ) [negative] => Array ( [0] => that [1] => but not this ) )
Для тех, кто ищет то же самое, я создал суть для PHP и JavaScript
https://gist.github.com/UziTech/8877a79ebffe8b3de9a2
function getSearchTerms($search) { $matches = null; preg_match_all("/-?\"[^\"]+\"|-?'[^']+'|\S+/", $search, $matches); // sort the terms $terms = [ "positive" => [], "negative" => [] ]; foreach ($matches[0] as $i => $match) { $negative = ("-" === $match[0]); if ($negative) { $match = substr($match, 1); } if (($match[0] === '"' && substr($match, -1) === '"') || ($match[0] === "'" && substr($match, -1) === "'")) { $match = substr($match, 1, strlen($match) - 2); } if ($negative) { $terms["negative"][] = $match; } else { $terms["positive"][] = $match; } } return $terms; }