1

我找到了这个答案 - https://stackoverflow.com/a/7943464/1901367 - 它给了我这个非常有用的代码,允许我解析包含引号和空格的搜索字符串。

preg_match_all('/(?<!")\b\w+\b|(?<=")\b[^"]+/', $subject, $result, PREG_PATTERN_ORDER);

我想知道是否有人可以告诉我如何更改此代码,以使 + 和 - 等布尔运算符保持不变,因为当前代码将它们剥离。

我想使用这些运算符对我的数据库进行全文布尔搜索,但我对这个我不理解的 REGEX 感到困惑。

示例输入和输出。

输入:'"this is some" text here is -more -"exlude me"' 输出:[this is some] [text] [here] [is] [-more] [-exclude me] 这些将在 $结果数组

因此,由空格分隔的所有内容都是单独的项目,除非它是用“”括起来的短语。这已经有效,但是在我有 -more 和 -"exlude me" 的地方,当前的结果将是 [more] 和 [exclude me] 丢失我想要保留的减号。

提前致谢!

4

2 回答 2

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)

正则表达式很棒,但有时它们会使事情变得比需要的更复杂。

于 2012-12-16T23:48:29.703 回答
1

您无法使用正则表达式捕获“-exclude me”,因为匹配项始终是连续的。充其量,您可以修改正则表达式以匹配“-more”标记,如下所示:

(?<!")-?\b\w+\b|(?<=")\b[^"]+

于 2012-12-17T01:09:45.220 回答