preg_match_all使用相同的模式与preg_replace具有不同的结果集

时间:2017-09-12 17:53:09

标签: php regex preg-replace preg-match-all

我发现preg_match_all和preg_replace根据相同的模式找不到相同的匹配。

我的模式是:

/<(title|h1|h2|h3|h4|h5|ul|ol|p|figure|caption|span)(.*?)><\/(\1)>/

当我针对包含

之类的片段运行时
<span class="blue"></span> 

使用preg_match_all我得到17场比赛。

当我在preg_replace中使用相同的模式时,我得到0个匹配。用选择列表替换\ 1确实找到了匹配项,但当然这不能作为解决方案,因为它不能确保结束标记与开始标记的类型相同。

总体目标是找到没有内容的标签实例,没有内容......我向你保证神圣的运动。

在测试正则表达式是否有效时,我也在php cli中尝试过它。这是输出:

Interactive shell

php > $str = 'abc<span class="blue"></span>def';
php > $pattern = "/<(title|h1|h2|h3|h4|h5|ul|ol|p|figure|caption|span)(.*?)><\/(\1)>/";
php > $final = preg_replace($pattern, '', $str);
php > print $final;
abc<span class="blue"></span>def

1 个答案:

答案 0 :(得分:1)

$str = 'abc<span class="blue"></span>def';
$pattern = "/<(title|h1|h2|h3|h4|h5|ul|ol|p|figure|caption|span)(.*?)><\/(\\1)>/";
                                                              // added \  ^
$final = preg_replace($pattern, '', $str);
print $final;
// echos 'abcdef'

说明:

"\1" // <-- character in octal notation

非常不同
'\1' // <-- backslash and 1

因为第一个是转义序列。这也是我几乎只使用单引号字符串的原因。见http://php.net/string#language.types.string.syntax.double