将确切的字词与任何字符正则表达式

时间:2015-08-05 10:17:07

标签: php regex

如何匹配确切的单词包含任何特殊字符?

$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

我想匹配包含任何字符的确切字词。就像我想在这个字符串中匹配单词'download'一样,它应该返回false

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

但是当我搜索下载时,它应该返回true。

由于

2 个答案:

答案 0 :(得分:3)

问题在于\b非单词字符之前的#字边界。 \b无法匹配2个非单词(或2个单词)字符之间的位置,因此,您无法获得匹配。

解决方案是删除第一个\b,或使用\B(2个字或2个非字字符之间的非字边界匹配)代替它。

\B#worldemojiday\b

或者

#worldemojiday\b

请参阅demo(或this one

请注意,\B也匹配字符串的开头。

以下是a way动态构建正则表达式,仅在必要时添加单词边界:

$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.");

答案 1 :(得分:1)

如何使用lookarounds

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

这确保了字符串之前或之后没有单词字符。见test at regex101