我正在尝试扫描字符串以检查单词的黑名单。我使用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 :(得分: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 library的automatically delimiters模式和handles unsafe characters:
if (Pattern::prepare(['\s*+', [$word], '\s*+'], 'i')->test($string_to_check)) {
PS:Pattern.test()
返回true
/ false