我有第三方索引搜索服务的布尔搜索字符串: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
因此,它背后的简单概念是将权重应用于单词,而不是{{1}}等。布尔搜索敏感词。请帮我微调正则表达式或给出一个新的正则表达式以获得所需的结果。
答案 0 :(得分:1)
问题在于您只获得包含\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\*\.]+
。
答案 1 :(得分:1)
使用前瞻就像魅力一样:
preg_replace('/\b(?!or|and|not)([a-z0-9*.])+/i', '$0'."[45]", $term);
您可以尝试HERE
编辑:也无需转义“*”和“。”在角色类里面
请注意,字符类中唯一的特殊字符或元字符是右括号(]),反斜杠(),插入符号(^)和连字符( - )。通常的元字符是字符类中的普通字符,不需要通过反斜杠进行转义。要搜索星号或加号,请使用[+ *]。如果你逃避字符类中的常规元字符,你的正则表达式将正常工作,但这样做会大大降低可读性。