0

我正在尝试扫描字符串以检查单词黑名单。我曾经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',那么一切都按预期工作。

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

4

3 回答 3

0

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

演示。

于 2013-05-07T16:22:10.523 回答
0

\b 匹配 \w(单词)和 \W(非单词)之间的位置

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

你必须使用类似的东西

preg_match('/\s*+'.preg_quote($word).'\s*+/i',$string_to_check)
于 2013-05-07T18:55:32.610 回答
0

您还可以使用T-Regx 库自动分隔您的模式并处理不安全的字符

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

PS:Pattern.test()退货true/false

于 2019-05-23T11:05:16.720 回答