PHP preg_match和preg_quote与美元符号不匹配

时间:2013-05-07 16:09:08

标签: php regex 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',那么一切都按预期工作。

我错过了一些非常明显的东西吗?

3 个答案:

答案 0 :(得分:0)

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

<强> DEMO.

答案 1 :(得分:0)

\ b匹配\ w(单词)和\ W(非单词)

之间的位置

\ w与[a-zA-Z0-9_]相同,因此$和空格都是非单词,所以如果'naughty_word'以符号开头或结尾,则表达式无法匹配

你必须使用像

这样的东西
preg_match('/\s*+'.preg_quote($word).'\s*+/i',$string_to_check)

答案 2 :(得分:0)

您还可以使用T-Regx libraryautomatically delimiters模式和handles unsafe characters

if (Pattern::prepare(['\s*+', [$word], '\s*+'], 'i')->test($string_to_check)) {

PS:Pattern.test()返回true / false