代码之家  ›  专栏  ›  技术社区  ›  Yehia A.Salam

用特定类别替换ul标签

  •  0
  • Yehia A.Salam  · 技术社区  · 15 年前

    我试图用一个级别0类替换所有的ul标签,如下所示:

    <ul>
        <li>Test
             <ul class="level0">
               ...
             </ul>
         </li>
    </ul>
    

    将被处理到

    <ul>
        <li>Test</li>
    </ul>
    

    我试过

    $_menu = preg_replace('/<ul class="level0">(.*)<\/ul>/iU', "", $_menu); 
    

    但它不起作用,救命?

    谢谢。

    耶希亚

    4 回复  |  直到 15 年前
        1
  •  6
  •   Gordon Haim Evgi    15 年前

    我确信这是一份副本,但无论如何,这里是如何处理的 DOM

    $dom = new DOMDocument;                          // init new DOMDocument
    $dom->loadHTML($html);                           // load HTML into it
    $xpath = new DOMXPath($dom);                     // create a new XPath
    $nodes = $xpath->query('//ul[@class="level0"]'); // Find all UL with class
    foreach($nodes as $node) {                       // Iterate over found elements
        $node->parentNode->removeChild($node);       // Remove UL Element
    }
    echo $dom->saveHTML();                           // output cleaned HTML
    
        2
  •  0
  •   RolandasR    15 年前

    尝试/mis而不是/iu

        3
  •  0
  •   SW4    15 年前

    您的代码工作得很好-除了您将$\u菜单作为字符串传递,该字符串包含的字符不是您进行preg\u替换时使用的字符,尽管事实上它看起来很好。字符串中还包含制表符、分隔符和空格,这些都是regex所不需要的。您可以使用以下方法解决此问题:

    (例如)

    $_menu='<ul>
        <li>Test
             <ul class="level0">
               ...
             </ul>
         </li>
    </ul>
    ';
    
    
    $breaks = array("
    ", "\n", "\r", "chr(13)", "\t", "\0", "\x0B");
    $_menu=str_replace($breaks,"",$_menu);
    
    $_menu = preg_replace('/<ul class="level0">(.*)<\/ul>/iU', "", $_menu); 
    
        4
  •  0
  •   Nik    15 年前

    尝试

    $str ='<ul>
        <li>Test
             <ul class="level0">
              tsts
             </ul>
         </li>
    </ul>
    ';
    //echo '<pre>';
    $str = preg_replace(array("/(\s\/\/.*\\n)/","/(\\t|\\r|\\n)/",'/<!--(.*)-->/Uis','/>\\s+</'),array("","","",'><'),$str);
    echo preg_replace('/<ul class="level0">(.*)<\/li>/',"</li>",trim($str));