6

我正在使用正则表达式单词边界\ b,并且我正在尝试匹配foo以下内容$sentence,但结果不是我需要的,这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);
4

3 回答 3

12

您将不得不创建DIY边界。

(?:\b|_\K)foo(?=\b|_)
于 2015-03-16T02:32:38.350 回答
0

这是否符合您的要求?:

preg_match_all("/foo/i", $sentence, $matches);
var_dump($matches);
于 2015-03-16T02:28:03.960 回答
0

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

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

请参阅此正则表达式演示。注意\bfoo=(?<!\w)foofoo(?!\w)= foo\b_\w(等于[^\W])减去 a 得到[^\W_]

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

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

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

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

在线查看PHP 演示

$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
于 2021-05-30T20:59:52.573 回答