【问题标题】:Match exact word with any character regex匹配任何字符正则表达式的确切单词
【发布时间】:2015-10-28 01:23:49
【问题描述】:

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

$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

我想匹配包含任何字符的确切单词。就像如果我想在这个字符串中匹配单词“下载”,它应该返回 false

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

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

谢谢

【问题讨论】:

    标签: php regex


    【解决方案1】:

    问题在于\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.");
    

    【讨论】:

    • 这个正则表达式的问题是当我试图找到它不匹配时。我想要一些可以找到带有单词边界的确切单词的东西。
    • 如果您正在动态构建正则表达式,您需要检查搜索字符串的第一个和最后一个字符。如果字符是单词字符,则添加\b。如果没有,请添加\B 或不添加任何内容。请发布您的实际代码。
    • @stribizhev 请告诉我单词边界覆盖了哪些字符?
    • 单词边界字符是字母、数字和下划线。要启用 Unicode 字边界支持,您需要使用 /u 修饰符。
    • 如果我尝试使用'/\w/'来查找它是否是单词边界中的字符,这会起作用吗?比如 preg_match('/\w/i','#');
    【解决方案2】:

    lookarounds怎么样:

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

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

    【讨论】:

    • 这是我正在寻找的确切答案。
    • 在 regexr.com 中尝试过,但它给出了错误。只需添加“!”后 '?'在 '(?
    • @RohitKhatri 确定这适用于 php/pcre :] 参见 the regex101 demo that I provided in answer。当然在 php 中需要将其放入分隔符并添加您的 i 标志以进行无大小写匹配:/(?&lt;!\w)#WorldEmojiDay(?!\w)/i
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2016-12-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多