我发现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
答案 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