PHP preg_match and preg_quote do not match the dollar sign

综合编程 2018-05-26 阅读原文

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)
Hello, buddy!

责编内容by:Hello, buddy!阅读原文】。感谢您的支持!

您可能感兴趣的

Filter Eloquent relationships “on-the-fly”, when y... I find more and more Eloquent functions that are rarely used, so continue posting these short tips on the blog. Here’s t...
Mix the html and php variables in an echo statemen... This may be a problem of my trouble with using single and double quotes in one statement. But I have this piece of code:...
PHP: table structure I'm developing a website that has some audio courses, each course can have multiple lessons. I want to display each c...
“Should I Learn to Code?” But first, do you want to learn? Having the will to learn makes all the difference. For most non-coders, codi...
Paypal Express Checkout Integration with PHP PayPal is the most popular payment gateway to integrate in your website to get paid all over the world. As we know t...