php
  • regex
  • replace
  • 2013-11-27 65 views 1 likes 
    1

    我需要一個正則表達式來清除兩個html標籤之間的所有內容。但標籤可以嵌套。PHP正則表達式來清除兩個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

    更換(.*)(.*?)正則表達式就會造成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之間且沒有v冰詩。

    +0

    這個伎倆!太感謝了。 – user2360754

    相關問題