【问题标题】:regular expression to remove li in php [duplicate]在php中删除li的正则表达式[重复]
【发布时间】:2011-04-06 04:52:50
【问题描述】:

可能重复:
PHP: Strip a specific tag from HTML string?

大家好,

我想从字符串中删除 li。我正在使用以下正则表达式,但它不起作用。可能是什么问题?

$str = '<div id="navigation" ><div class="menuwrap"><ul><li><a href="#">Home
</a></li><li class="select"><a href="#">About Us</a></li><li><a href="#">Services 
</a></li><li><a href="#">Clients</a></li><li><a href="#">Contact Us</a></li></ul>
</div><div class="submenu"><ul><li><a href="#">Submenu1</a></li><li><a   
href="#">Submenu2</a></li><li><a href="#">Submenu3</a></li>
<li><a href="#">Submenu4</a>
</li></ul></div></div>';

$replacelink = 'Contact Us';  

echo $str = preg_replace('/<li(.*?)>\s*\b<a(.*?)>\s*\b'.$replacelink.'\b\s*<\/a>  
\b\s*<\/li>/i', '', $str);

【问题讨论】:

    标签: php


    【解决方案1】:

    这应该可行:

    echo preg_replace('/<li><a[^>]*>'.$replacelink.'<\/a><\/li>/s', '', $str);
    

    但请记住manipulate DOM 的工具不是正则表达式:)

    【讨论】:

      【解决方案2】:

      从您的正则表达式中删除单词边界 (\b)。目前,您正在寻找任意数量的空格,然后是单词边界,然后是 &lt;。空格和&lt; 之间永远不会有单词边界。

      Using the solution 在副本中,您应该能够使用:contains() XPath 选择器在不使用正则表达式的情况下执行此操作:

      $dom = new DOMDocument;
      $dom->loadHTML($str);
      $xPath = new DOMXPath($dom);
      $nodes = $xPath->query('//a:contains('.$replacelink.')');
      if($nodes->item(0)) {
          $li = $nodes->item(0)->parentNode; 
          $li->parentNode->removeChild($li);
      }
      $str = $dom->saveHTML();
      

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2013-01-07
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多