2013-05-07 46 views
0

我试图扫描一个字符串来检查黑名单中的单词。我使用preg_quote来处理特殊字符,例如星号,但它似乎不适用于美元符号。PHP preg_match和preg_quote不匹配美元符号

下面是测试我一直在运行:

$string_to_check = 'wordcontaining$'; 
$naughty_words = array('wordcontaining$', 'a*differentstring'); 
if(isset($naughty_words)){ 
    foreach($naughty_words as $word){ 
     if (preg_match('/\b'.preg_quote($word).'\b/i',$string_to_check)) { 
      var_export(array('found'=> true, 'word'=>$word)); 
     } 
    } 
} 

,我会希望返回

array (
    'found' => true, 
    'word' => 'wordcontaining$', 
) 

但不幸的是事实并非如此。如果我设置了$string_to_check = 'a*differentstring',那么一切都按预期工作。

我在这里错过了非常明显的东西吗?

+0

什么'\ b'在你的正则表达式中做什么? – Rikesh 2013-05-07 16:12:25

+0

如果我没有记错(自从我编码以来已经有一段时间了),它只会查找完整的单词,即如果列入黑名单的单词出现在较长单词的中间,则不匹配。 – Josh 2013-05-07 16:15:14

+0

\ b是一个零宽度的字边界(我相信它相当于'($ | \ W | ^)')。你能否尝试导出preg_quote的结果来查看它是否正确摆脱了美元符号? – Adrian 2013-05-07 16:17:44

回答

1

\ B A \之间瓦特(字)和\ W(非字)

\ w是与[A-ZA-Z0-9_一个位置相匹配]因此$和空间都是非字,所以如果“naughty_word”开始或结束与符号表达式无法比拟

,你必须使用类似

preg_match('/\s*+'.preg_quote($word).'\s*+/i',$string_to_check) 
1

因此,根据我上面的评论,您需要从正则表达式中删除第二个额外的\b

DEMO.

+0

不幸的是,根据上面的评论,这也会使'wordcontaining $ aaa'是一个无意的有效单词。 – Josh 2013-05-08 08:16:00