PHP正则表达式清除两个html标签之间(嵌套)

时间:2013-11-27 06:55:39

标签: php regex replace

我需要一个正则表达式来清除两个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>

所以问题是;我怎么能做到这一点?

非常感谢。

1 个答案:

答案 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>

请注意,此正则表达式“仅清除”holdersection之间的文字,而不是反之。