使用任意字符正则表达式匹配精确单词

7
如何匹配包含任何特殊字符的精确单词?
$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个回答

3
问题在于在#非单词字符之前的\b单词边界。 \b无法匹配2个非单词(或两个单词)字符之间的位置,因此,您将无法获得匹配。 解决方案要么是删除第一个\b,要么使用\B(匹配2个单词或两个非单词字符之间的非单词边界)替换它。
\B#worldemojiday\b

或者

#worldemojiday\b

请参见演示(或此链接)。

注意,\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.");

这个正则表达式的问题在于当我尝试查找“celebrate”时它无法匹配。我想要一个能够精确匹配单词边界的东西。 - user3049006
1
如果您正在动态构建正则表达式,则需要检查搜索字符串的第一个和最后一个字符。如果该字符是单词字符,则添加\b。如果不是,则添加\B或什么也不添加。请发布您的实际代码。 - Wiktor Stribiżew
@stribizhev,您能告诉我什么字符被单词边界所覆盖吗? - user3049006
单词边界字符包括字母、数字和下划线。要启用Unicode单词边界支持,您需要使用/u修饰符。 - Wiktor Stribiżew
1
如果我尝试使用'/\w/'来查找字符是否在单词边界上,这样会有效吗?例如preg_match('/\w/i','#'); - user3049006
显示剩余3条评论

1

这正是我在寻找的确切答案。 - user3049006
在regexr.com中尝试过,但出现了错误。只需在“(?<!\w)”后面添加“!”即可。 - user3049006
@RohitKhatri 确定这在php/pcre中可行:]请参见我在答案中提供的regex101演示。当然,在php中需要将其放入分隔符中,并添加您的i标志以进行不区分大小写的匹配:/(?<!\w)#WorldEmojiDay(?!\w)/i - Jonny 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接