1

我有一个用于第三方索引搜索服务的布尔搜索字符串:Germany or (Indian, Tech*)

我希望我的结果在处理后:Germany[45] or (Indian[45], Tech*[45]). 这里 45 是搜索服务所需的权重。

在谷歌搜索了很长时间后,我得到了结果:Germany[45] or (Indian[45], Tech[45]*). 在这里你可以看到*已经来了,[45]这不是必需的。

输出应该是:Germany[45] or (Indian[45], Tech*[45]),寻找*之前[45]

代码:

preg_replace('/([a-z0-9\*\.])+(\b(?<!or|and|not))/i', '$0'."[45]", $term);

所以它背后的简单概念是对单词应用权重,而不是对or/and/not等布尔搜索敏感词。请帮助我微调正则表达式或提供新的正则表达式以获得所需的结果。

4

2 回答 2

3

问题是你只得到包含\b- 一个单词边界的匹配项。由于星号是一个非单词字符,它正在从匹配中消除它,所以解决方案是允许单词边界或星号(\*|\b)

preg_replace('/([a-z0-9.]+)((\*|\b)(?<!or|and|not))/i', '$0'."[45]", $term);

但是,使用负前瞻更简单:

preg_replace('/\b(?!or|and|not)([a-z0-9*.]+)/i', '$0'."[45]", $term);

注意:在字符类中,星号和句点不是元字符,因此不需要像在原始表达式中那样对它们进行转义:[a-z0-9\*\.]+.

于 2013-08-14T12:29:59.517 回答
0

使用前瞻就像一个魅力:

preg_replace('/\b(?!or|and|not)([a-z0-9*.])+/i', '$0'."[45]", $term);

你可以试试这里

编辑:也不需要转义“*”和“。” 在字符类中

请注意,字符类中唯一的特殊字符或元字符是右括号 (])、反斜杠 ()、插入符号 (^) 和连字符 (-)。通常的元字符是字符类中的普通字符,不需要用反斜杠转义。要搜索星号或加号,请使用 [+*]。如果您在字符类中转义常规元字符,您的正则表达式将正常工作,但这样做会显着降低可读性。

来源:http ://www.regular-expressions.info/

于 2013-08-14T12:50:45.800 回答