我正试图找到一种方法来实现这一点,当用户进行搜索时,默认情况下需要所有单词。
这在开始时似乎很容易,只需打破单词并在每个单词的开头添加+
符号;但是当你开始尝试实现其他运算符时,它会变得复杂。
这是我到目前为止所拥有的......
function prepareKeywords($str) {
// Remove any + signs since we add them ourselves
// Also remove any operators we don't allow
// We don't allow some operators as they would have no use in the search since we don't order our results by relevance
$str = str_replace(array('+','~','<','>'), '', $str);
// Remove anything more than once space
$str = preg_replace('/\s{2,}/', ' ', $str);
// Now break up words into parts
$str = str_getcsv($str, ' ', '"');
// Now prepend a + sign to the front of each word
foreach ($ks as $key => $word) {
// First we check to make sure the start of the word doesn't already contain an operator before we add the + sign to the start
if (in_array($word{0}, array('-','<','>','~'))) {
} else {
$ks[$key] = '+' . $word;
}
}
// Now put word back to string
//$ks = implode(' ', $ks);
}
正如你所看到的那样,目前只有目前为止,尊重引用的字符串,但后来我开始考虑不分解()
,然后如果它包含嵌套的双引号,反之亦然。 ......它开始变得很毛茸茸。
所以我试图弄清楚是否有一种方法可以做我想要的而不会弄乱字符串并且只是默认需要所有单词,除非用户使用-
专门否定它们。
答案 0 :(得分:0)
当然你可以在模式中使用preg_match()和\ b作为单词边界吗?
您可以使用
之类的内容拆分搜索字词preg_match_all('/\b(.*)\b/', $matches);
我可能会在错误的想法,因为它已经很晚了,但它可能会让你有所作为