我有一个布尔搜索string用于第三方索引搜索服务: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
等布尔搜索敏感单词。请帮助我微调正则表达式或提供一个新的正则表达式以获得所需的结果。
问题是,您只得到包含'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'*'.]+
中那样转义。
使用前瞻性就像一种魅力:
preg_replace('/'b(?!or|and|not)([a-z0-9*.])+/i', '$0'."[45]", $term);
你可以在这里试试
编辑:也不需要逃避"answers"在字符类内
请注意,字符类中唯一的特殊字符或元字符是右括号(])、反斜杠()、插入符号(^)和连字符(-)。通常的元字符是字符类中的普通字符,不需要用反斜杠转义。要搜索星号或加号,请使用[+*]。如果转义字符类中的常规元字符,正则表达式将正常工作,但这样做会显著降低可读性。
来源:http://www.regular-expressions.info/