preg_match:找不到具有尾随特殊字符的子字符串

I have a function which uses preg_match to check for if a substring is in another string. Today I realize that if substring has trailing special characters like special regular expression characters (. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -) or @, my preg_match can't find the substring even though it is there.

This works, returns "A match was found."

$find = "website scripting";
$string =  "PHP is the website scripting language of choice.";

if (preg_match("/\b" . $find . "\b/i", $string)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

But this doesn't, returns "A match was not found."

$find = "website scripting @";
$string =  "PHP is the website scripting @ language of choice.";

if (preg_match("/\b" . $find . "\b/i", $string)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

I have tried preg_quote, but it doesn't help.

Thank you for any suggestions!

Edit: Word boundary is required, that's why I use \b. I don't want to find "phone" in "smartphone".

You can just check if the characters around the search word are not word characters with look-arounds:

$find = "website scripting @";
$string =  "PHP is the website scripting @ language of choice.";

if (preg_match("/(?<!\\w)" . preg_quote($find, '/') . "(?!\\w)/i", $string)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

See IDEONE demo

Result: A match was found.

Note the double slash used with \w in (?<!\\w) and (?!\\w), as you have to escape regex special characters in interpolated strings.

The preg_quote function is necessary as the search word - from what I see - can have special characters, and some of them must be escaped if intended to be matched as literal characters.

UPDATE

There is a way to build a regex with smartly placed word boundaries around the keyword, but the performance will be worse compared with the approach above. Here is sample code:

$string =  "PHP is the website scripting @ language of choice.";

$find = "website scripting @";
$find = preg_quote($find);
if (preg_match('/\w$/u', $find)) {   //  Setting trailing word boundary
    $find .= '\\b'; 
} 
if (preg_match('/^\w/u', $find)) {   //  Setting leading word boundary
    $find = '\\b' . $find;
}

if (preg_match("/" . $find . "/ui", $string)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

See another IDEONE demo

If you try to find a string from another string, you can strpos().

Ex.

<?php

$find = "website scripting";
$string =  "PHP is the website scripting language of choice.";

if (strpos($string,$find) !== false) {
    echo 'true';
} else {
    echo 'false';
}