我有一个动态字符串,其中可能包含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的组?
答案 0 :(得分:1)
在1个以上的步骤中进行操作可能会容易得多:
<h2>...</h2>
序列<br />
序列中删除<h2>...</h2>
标记或者,搜索:
(<\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