PHP Regex Word Boundary排除下划线_

时间:2015-03-16 02:15:12

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

我正在使用正则表达式字边界\ b,并且我尝试匹配以下foo中的$sentence,但结果不是我需要的,{{1杀死我,我希望下划线是字形边界,就像连字符或空格:

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

3 个答案:

答案 0 :(得分:7)

您必须创建DIY边界。

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

答案 1 :(得分:0)

这样做你想要的吗?:

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

答案 2 :(得分:0)

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

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

this regex demo。注意 \bfoo = (?<!\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