我有一个第三方索引搜索服务的布尔搜索字符串 : 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);
你可以尝试一下这里
编辑:也没必要逃跑“*”和“” 字符类中
注意,字符类中的唯一的特殊字符或元字符是右括号([),反斜杠(),插入符号(^)和连字符( - )。 通常的元字符是一个字符类中的正常字符,不需要通过反斜杠转义。 要搜索某个明星或加,使用[+ *]。 如果你逃脱字符类内部的规则的元字符,但这样做显著降低可读性你的正则表达式将正常工作。
来源: http://www.regular-expressions.info/
文章来源: Add text to string using regular expression(preg_replace:php) with restricted words