我找到了这个答案 - https://stackoverflow.com/a/7943464/1901367 - 它给了我这个非常有用的代码,允许我解析包含引号和空格的搜索字符串。
preg_match_all('/(?<!")\b\w+\b|(?<=")\b[^"]+/', $subject, $result, PREG_PATTERN_ORDER);
我想知道是否有人可以告诉我如何更改此代码,以便它保留完整的布尔运算符,例如+和 - ,因为当前代码将它们删除。
我想利用这些运算符对我的数据库进行全文布尔搜索,我对此不太理解的REGEX感到困惑。
输入和输出示例。
输入:'“这是一些”这里的文字是 - 更多 - “不在我身边” 输出:[这是一些] [文本] [这里] [是] [-more] [-exclude me]这些将在$ result数组中
因此,空格分隔的所有内容都是单独的项目,除非它是用“”括起来的短语。这已经有效了,但我已经 - 并且 - “我不知道”结果目前会[更多]和[排除我]失去我想要保留的减号。
提前致谢!
答案 0 :(得分:1)
您可以使用简单的正则表达式来抽出令牌,使用引号及其中的所有内容,然后在使用它们之前将它们弄清楚。像这样:
function query_tokens($query)
{
$regex = '/-?"[\pL\s]+"|-?\pL+/';
preg_match_all($regex, $query, $tokens, PREG_SET_ORDER);
foreach ($tokens as & $token)
{
$token = array_shift($token);
$modifier = NULL;
if ($token[0] === '-' || $token[0] === '+')
{
$modifier = $token[0];
$token = substr($token, 1);
}
if ($token[0] === '"')
{
$token = trim($token, '"');
}
$token = $modifier.$token;
}
return $tokens;
}
使用的字符串和函数的结果:
var_dump(query_tokens('"this is some" text here is -more -"exlude me"'));
array (size=6)
0 => string 'this is some' (length=12)
1 => string 'text' (length=4)
2 => string 'here' (length=4)
3 => string 'is' (length=2)
4 => string '-more' (length=5)
5 => string '-exlude me' (length=10)
正则表达式很棒,但有时它们会使事情变得比它们需要的更复杂。
答案 1 :(得分:1)
您无法使用正则表达式捕获'-exclude me',因为匹配始终是连续的。充其量,您可以修改正则表达式以匹配'-more'标记:
(?<!")-?\b\w+\b|(?<=")\b[^"]+