与受限词:使用正则表达式(PHP的preg_replace)将文本添加到字符串(Add text t

2019-09-27 18:08发布

我有一个第三方索引搜索服务的布尔搜索字符串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等布尔搜索敏感词。 请帮我微调正则表达式或给一个新的正则表达式来获得所需的结果。

Answer 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\*\.]+



Answer 2:

使用前瞻就像一个魅力:

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