specifics用php函数替换string中的substring

时间:2014-10-10 06:14:08

标签: php preg-replace replaceall

在文中,我想替换 div 标记 li 。但不是每个人都确定定义明确。在这种情况下,那些具有开始的标签" tab - *" 我需要从文本中轻松使用PHP函数:

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

获取此文本

<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>
你可以告诉我吗?

谢谢

2 个答案:

答案 0 :(得分:1)

正则表达式不足以解析HTML。你试图使用的任何正则表达式都是脆弱的。我建议改为使用DOM extension

这个想法是:

  1. 使用XPath query <div>
  2. 查找id属性以"tab-"开头的所有//div[starts-with(@id, "tab-")]元素
  3. Create每个人都有一个新的<li>元素。
  4. 将所有<div>的属性和子节点移动到新的<li>元素。
  5. 将旧的<div>替换为新的<li>
  6. 因为你的字符串没有根元素,我们会在之前和之后做一点舞蹈,然后把它放在一个然后重建它。


    实施例

    $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;
    

    输出:

    <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 :(得分:0)

使用php的domdocument xml组件只需在domdocument对象中加载字符串并搜索该元素然后获取其属性并检查其id并使用preg_replace进行比较并删除它是否符合您的条件