dongyao4003 2014-10-10 06:14
浏览 50
已采纳

specifics用php函数替换string中的substring

in the text, i would like to replace the div tag li. But not everyone just certain well defined. In this case, those that have id that begins "tab-*" I need something using PHP functions easily from text:

<div id="tab-141285" class="my-class">                         
  <div class="my-subclass">              
    <div>                     
     Lorem ipsum dolor sit amet consectetuer                 
    </div>             
  </div>                 
</div>                   
<div id="tab-85429"  class="my-class">                                  
  <div class="my-subclass">              
    <div>                      
    Lorem ipsum dolor sit amet consectetuer                  
    </div>             
  </div>                 
</div>

get this text

<li id="tab-141285" class="my-class">                          
  <div class="my-subclass">              
    <div>                     
     Lorem ipsum dolor sit amet consectetuer                 
    </div>             
  </div>                 
</li>                
<li id="tab-85429"  class="my-class">                                   
  <div class="my-subclass">              
    <div>                      
    Lorem ipsum dolor sit amet consectetuer                  
    </div>             
  </div>                 
</li>

Can you advise me?

Thank you

  • 写回答

2条回答 默认 最新

  • duanpie2834 2014-10-10 09:11
    关注

    Regular expressions are not adequate for parsing HTML. Any regex you try to use will be fragile. I suggest using the DOM extension for this instead.

    The idea is to:

    1. Find all the <div> elements that have an id attribute that begins with "tab-" using the XPath query //div[starts-with(@id, "tab-")]
    2. Create a new <li> element for each of them.
    3. Move all the <div>'s attributes and child nodes to the new <li> element.
    4. Replace the old <div> with the new <li>.

    Because your string doesn't have a root element, we'll do a little dance before and after to put it in one then rebuild it.


    Example:

    $html = <<<'HTML'
    <div id="tab-141285" class="my-class">
      <div class="my-subclass">
        <div>
         Lorem ipsum dolor sit amet consectetuer
        </div>
      </div>
    </div>
    <div id="tab-85429"  class="my-class">
      <div class="my-subclass">
        <div>
        Lorem ipsum dolor sit amet consectetuer
        </div>
      </div>
    </div>
    HTML;
    
    $dom = new DOMDocument();
    $dom->loadHTML("<div>$html</div>", LIBXML_HTML_NOIMPLIED);
    $xpath = new DOMXPath($dom);
    
    $nodes = $xpath->query('//div[starts-with(@id, "tab-")]');
    
    foreach ($nodes as $node) {
        $li = $dom->createElement('li');
    
        while ($node->attributes->length) {
            $li->setAttributeNode($node->attributes->item(0));
        }
        while ($node->firstChild) {
            $li->appendChild($node->firstChild);
        }
    
        $node->parentNode->replaceChild($li, $node);
    }
    
    $html = '';
    foreach ($dom->documentElement->childNodes as $node) {
        $html .= $dom->saveHTML($node);
    }
    
    echo $html;
    

    Output:

    <li id="tab-141285" class="my-class">
      <div class="my-subclass">
        <div>
         Lorem ipsum dolor sit amet consectetuer
        </div>
      </div>
    </li>
    <li id="tab-85429" class="my-class">
      <div class="my-subclass">
        <div>
        Lorem ipsum dolor sit amet consectetuer
        </div>
      </div>
    </li>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 易康econgnition精度验证
  • ¥15 线程问题判断多次进入
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致