user3049006
user3049006

Reputation:

Match exact word with any character regex

How to match exact word contains any special character ?

$string = 'Fall in love with #PepsiMoji! Celebrate #WorldEmojiDay by downloading our keyboard @ http://bit.ly/pepsiKB & take your text game up a notch. - teacher';

preg_match("/\b#worldemojiday\b/i",$string); //false

I want to match exact word containing any character. Like if I want to match word 'download' in this string, It should return false

preg_match("/\bdownload\b/i",$string); //false

But when I search for downloading, It should return true.

Thanks

Upvotes: 7

Views: 2325

Answers (2)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627343

The problem is with \b word boundary before # non-word character. \b cannot match the position between 2 non-word (or between 2 word) characters, thus, you do not get a match.

A solution is either to remove the first \b, or use \B (a non-word boundary matching between 2 word or 2 non-word characters) instead of it.

\B#worldemojiday\b

Or

#worldemojiday\b

See demo (or this one)

Note that \B also matches at the beginning of a string.

Here is a way to build a regex dynamically, adding word boundaries only where necessary:

$srch = "žvolen";
$srch = preg_quote($srch);
if (preg_match('/\w$/u', $srch)) {
    $srch .= '\\b';   
}

if (preg_match('/^\w/u', $srch)) {
    $srch = '\\b' . $srch;
}
echo preg_match("/" . $srch . "/ui", "žvolen is used.");

Upvotes: 3

Jonny 5
Jonny 5

Reputation: 12389

What about using lookarounds:

(?<!\w)#WorldEmojiDay(?!\w)

This ensures, that there's no word character before or after the string. See test at regex101

Upvotes: 1

Related Questions