我需要一个正则表达式来清除两个html标签之间的所有内容。但标签可以嵌套。
我写了这个
$theHTML = '
<div class="holder">
dynamic text 1
<div class="section"> section text </div>
</div>
';
$first='<div class="holder">';
$second='<div class="section">';
$replace = "";
$find = preg_replace('#('.preg_quote($first).')(.*)('.preg_quote($second).')#si', '$1'.$replace.'$3', $theHTML);
输出;
<div class="holder"><div class="section"> section text </div>
</div>
当我们只有一场比赛时,一切正常。但是这个代码可以像这样禁止使用;
$theHTML = '
<div class="holder">
dynamic text 1
<div class="section">
section text
<div class="holder">
dynamic text 1
<div class="section"> section text </div>
</div>
</div>
</div>
';
输出将是;
<div class="holder"><div class="section"> section text </div>
</div>
</div>
</div>
你可以看到它删除了第一场比赛中的所有内容。我想得到什么;
<div class="holder"><div class="section">
section text
<div class="holder"><div class="section"> section text </div>
</div>
</div>
</div>
所以问题是;我怎么能做到这一点?
非常感谢。
答案 0 :(得分:1)
将正则表达式中的(.*)
替换为(.*?)
,这将导致 lazy evaluation ,这正是您所需要的
$theHTML = '$theHTML = '<div class="holder">
dynamic text 1
<div class="section">
section text
<div class="holder">
dynamic text 1
<div class="section"> section text </div>
</div>
</div>
</div>';
$first='<div class="holder">';
$second='<div class="section">';
$replace = "";
$find = preg_replace('#('.preg_quote($first).')(.*?)('.preg_quote($second).')#si', '$1'.$replace.'$3', $theHTML);
echo $find;
<强>输出强>
<div class="holder"><div class="section">
section text
<div class="holder"><div class="section"> section text </div>
</div>
</div>
</div>
请注意,此正则表达式“仅清除”holder
到section
之间的文字,而不是反之。