如何匹配包含特殊字符的精确单词
$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。
谢谢
问题是'b
字边界在#
非字字符之前。'b
不能匹配2个非单词(或2个单词)字符之间的位置,因此,您无法获得匹配。
一种解决方案是删除第一个'b
,或者使用'B
(2个单词或2个非单词字符之间的非单词边界匹配)代替它。
'B#worldemojiday'b
或
#worldemojiday'b
参见demo(或这个)
注意'B
也匹配字符串的开头。
这是一种动态构建正则表达式的方法,只在必要的地方添加词边界:
$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.");
如何使用遍历:
(?<!'w)#WorldEmojiDay(?!'w)
这确保在字符串之前或之后没有字元。参见regex101