PHP 正则表达式单词边界排除下划线 _
PHP Regex Word Boundary exclude underscore _
我正在使用正则表达式字边界\b,我试图在下面的$sentence
中匹配foo
,但结果不是我需要的,underscore
快要死了,我希望下划线像连字符或 space:
一样成为单词边界
$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_match_all("/foo/i", $sentence, $matches);
var_dump($matches);
您必须创建 DIY 边界。
(?:\b|_\K)foo(?=\b|_)
您可以从 \w
中减去 _
并使用明确的单词边界:
/(?<![^\W_])foo(?![^\W_])/i
参见 this regex demo。注意 \bfoo
= (?<!\w)foo
和 foo(?!\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
我正在使用正则表达式字边界\b,我试图在下面的$sentence
中匹配foo
,但结果不是我需要的,underscore
快要死了,我希望下划线像连字符或 space:
$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_match_all("/foo/i", $sentence, $matches);
var_dump($matches);
您必须创建 DIY 边界。
(?:\b|_\K)foo(?=\b|_)
您可以从 \w
中减去 _
并使用明确的单词边界:
/(?<![^\W_])foo(?![^\W_])/i
参见 this regex demo。注意 \bfoo
= (?<!\w)foo
和 foo(?!\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