的测试
如何匹配包含特殊字符的精确单词
$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#worldemojidayb/i",$string); //false
我要匹配包含任何字符的精确单词。例如,如果我想在这个字符串中匹配单词'download',它应该返回false
preg_match("/bdownloadb/i",$string); //false
但是当我搜索下载时,它应该返回true。
谢谢
问题是b
字边界在#
非字字符之前。b
不能匹配2个非单词(或2个单词)字符之间的位置,因此,您无法获得匹配。
一种解决方案是删除第一个b
,或者使用B
(2个单词或2个非单词字符之间的非单词边界匹配)代替它。
B#worldemojidayb
或
#worldemojidayb
参见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