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

I'm trying to scan a string to check against a blacklist of words. I've used preg_quote to handle special characters such as an asterisk but it doesn't seem to work for the dollar sign.

Here is a test I've been running:

$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));
        }
    }
}

which I would expect to return

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

but unfortunately it's not. If I set $string_to_check = 'a*differentstring' then everything works as expected.

Have I missed something very obvious here?

\b matches a position between a \w (word) and a \W (non-word)

\w is the same as [a-zA-Z0-9_] so $ and space are both non-word, so if the 'naughty_word' starts or ends with a symbol your expression can't match

you have to use something like

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

So as per my comment above, you need to remove the second extra \b from your regex.

DEMO.

You can also use T-Regx library which automatically delimiters your pattern and handles unsafe characters:

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

PS: Pattern.test() returns true/false