正则表达式:删除双<br />标签

时间:2019-07-03 08:33:11

标签: php regex

我有一个动态字符串,其中可能包含h2标签,而在那些h2标签中则包含一些br标签。我想从字符串中删除那些br标签。

<h2>Headline 1</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.<h2>Headline 2 <br /><br /></h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr<h2>Headline 2<br /><br /></h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr<h2>Headline 2</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr

要删除br标签,我使用以下正则表达式:

/<h2.*?>.+?(<br[\s+]?\/>).+?<\/h2>/

问题是,我的第一个比赛是<h2>Headline 1</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.<h2>Headline 2 <br /><br /></h2>。 是的,按照设计的方式工作:-)但是我如何使正则表达式仅捕获h2标签中带有br的组?

2 个答案:

答案 0 :(得分:1)

在1个以上的步骤中进行操作可能会容易得多:

  1. 使用正则表达式提取<h2>...</h2>序列
  2. 使用正则表达式从<br />序列中删除<h2>...</h2>标记
  3. 写新的字符串
  4. 按原样复制其他所有内容

或者,搜索:

(<\s*h2[^<]*>[^<]*)<\s*br\s*\/\s*>

并替换为:

\1

重复直到不再进行替换为止。

测试here


另一种解决方案(更智能)是使用适当的HTML解析器,并做所有您想做的魔术。

答案 1 :(得分:1)

我建议您使用DOM解析器。

但是,如果您确实想使用正则表达式,在这种情况下可以接受,则可以使用preg_replace_callback:

$html = '<h2>Headline 1</h2>Lorem ipsum.<h2>Headline 2 <br /><br /></h2>dolor sit amet,<h2>Headline 2<br /><br /></h2>consetetur<br /> sadipscing elitr<h2>Headline 2</h2>Lorem<br /> ipsum';

# first, extract the string inside <h2>...</h>
$res = preg_replace_callback('~<h2>\K.*?(?=</h2>)~', 
            function($m) {
                # then remove the <br />
                return  preg_replace('~<br />~', '', $m[0]);
            },
            $html);

echo $res;

输出:

<h2>Headline 1</h2>Lorem ipsum.<h2>Headline 2 </h2>dolor sit amet,<h2>Headline 2</h2>consetetur<br /> sadipscing elitr<h2>Headline 2</h2>Lorem<br /> ipsum