正则表达式根据其内容删除整个段落?

时间:2011-02-19 14:05:15

标签: php regex preg-replace html-parsing

嘿伙计们, 我是一个正则表演者, 是否可以使用preg_replace删除整个段落标记?

<p><div class="vidwrapper"> lot of content with oder divs etc. </div><p>

如果以下div具有.vidwrapper类,则只应删除该段。

这甚至可能吗?知道这个正则表达式会是什么样子吗? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

使用正则表达式执行此操作是一个坏主意,除非您知道在vidwrapper内部没有段落(或任何可能表面上被解释为段落的内容)。

如果你不这样做,那么为这样的事情写一个正则表达式将非常困难:

<p><div class="vidwrapper"> Hello there. <p>Wee.</p> Yoink. </div></p>
<p><div class="vidwrapper"> Hello there. <!-- <p>Wee.</p> --> Yoink. </div></p>

更简单(也更强大)的方法可能是用HTML解析器解析HTML,而是在DOM树上进行搜索。

另见:

答案 1 :(得分:1)

如果它是固定的,那么以下可能有效:

preg_replace('#<p>[^<]*<div[^>]+class="vidwrapper"[^>]*>.*?</p>#is', "")

对于匹配嵌套的html,你通常需要一个递归正则表达式,因此为什么像phpQuery或QueryPath这样的东西通常更简单:

$html = pq($html)->find("p div.vidwrapper")->parent()->remove()->html();

答案 2 :(得分:0)

如果您认为该脚本会导致问题,您也可以使用它。

#
 \s*
 <p\s*> \s* <div \s+ class \s* = \s* (["']) vidwrapper \1 \s* >
 (?:
      <script (?:\s+ (?:".*?"|'.*?'|[^>]*?)+)? \s*>
      .*?
      </script\s*>)
   |  .
 )*?
 </p\s*>
#xs