【问题标题】:PHP Regex Word Boundary exclude underscore _PHP 正则表达式字边界排除下划线_
【发布时间】:2015-03-16 02:15:11
【问题描述】:

我正在使用正则表达式单词边界\b,我试图在下面的$sentence 中匹配foo,但结果不是我需要的,underscore 正在杀死我,我想要下划线像连字符或空格一样是单词边界:

$sentence = "foo_foo_foo foo-foo_foo";
              X   X   X  YES  X   X

预期:

$sentence = "foo_foo_foo foo-foo_foo";
             YES YES YES YES YES YES

我的代码:

preg_match("/\bfoo\b/i", $sentence);

【问题讨论】:

  • 您是否尝试过在线搜索?
  • 我在谷歌上找不到这个特定的问题
  • 你能在这里用preg_split代替preg_match吗?
  • @Sunny 网上有关于这个的文章,相关问题部分有很多与他相关的不同问题。
  • @sectus 它必须是 preg_match :(

标签: php regex localization preg-match word-boundary


【解决方案1】:

您必须创建DIY 边界。

(?:\b|_\K)foo(?=\b|_)

【讨论】:

    【解决方案2】:

    这是你想要的吗?:

    preg_match_all("/foo/i", $sentence, $matches);
    var_dump($matches);
    

    【讨论】:

    • 不,因为它也会匹配 foobar 而我只想要完整的单词
    【解决方案3】:

    您可以从\w 中减去_ 并使用明确的字边界:

    /(?<![^\W_])foo(?![^\W_])/i
    

    this regex demo。注意\bfoo = (?&lt;!\w)foofoo(?!\w) = foo\b,从\w 中减去_(等于[^\W])得到[^\W_]

    在 PHP 中,您可以使用 preg_match_all 来查找所有匹配项:

    preg_match_all("/(?<![^\W_])foo(?![^\W_])/i", $sentence)
    

    要替换/删除所有匹配项,您可以使用preg_replace

    preg_replace("/(?<![^\W_])foo(?![^\W_])/i", "YES", $sentence)
    

    PHP demo online

    $sentence = "foo_foo_foo foo-foo_foo";
    if (preg_match_all("/(?<![^\W_])foo(?![^\W_])/i", $sentence, $matches)) {
        print_r($matches[0]);
    }
    // => Array( [0] => foo [1] => foo [2] => foo [3] => foo [4] => foo [5] => foo)
    echo PHP_EOL . preg_replace("/(?<![^\W_])foo(?![^\W_])/i", "YES", $sentence);
    // => YES_YES_YES YES-YES_YES
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2016-02-19
      • 2018-09-30
      • 2014-05-03
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多