【问题标题】:regexp to remove entire paragraph based on it's content?正则表达式根据其内容删除整个段落?
【发布时间】:2011-02-19 14:05:14
【问题描述】:

大家好, 我是一个正则表达式菜鸟, 是否可以使用 preg_replace 删除整个段落标签?

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

只有在 div 之后的段落具有 .vidwrapper 类时,才应删除该段落。

这可能吗?知道这个正则表达式的样子吗? 感谢您的帮助。

【问题讨论】:

  • 可以用正则表达式做到这一点,但总会有你无法处理的极端情况(至少,不在“合理”范围内)。在正则表达式可能阻塞的地方使用以下字符串:&lt;p&gt;&lt;div class="vidwrapper"&gt; &lt;!-- &lt;/p&gt; --&gt; lot of content with oder divs etc.&lt;/div&gt;&lt;p&gt;。尝试使用一个(或多个)正则表达式(-es)来修复这些小问题很可能会导致一个可怕的、容易出错且难以维护的解决方案。
  • 里面永远不会有另一个

    !这个 div 内部的结构总是相同的!里面只有其他 div 和一个

  • 不应该是这样的吗:$para = "/&lt;p&gt;&lt;div class='vidwrapper'&gt;(.*?)&lt;\/div&gt;&lt;\/p&gt;/smix";
  • 如果我能理解您要做什么,我可以为您编写正则表达式。你能举一些之前和之后的具体例子吗?
  • 嗯,这很简单!我有一个复杂的自定义 html,其中包括一个带有 swfobject 的 youtube 播放器。这个复杂的 html 在我博客的每篇文章中都是一样的,并且总是包含在这个 &lt;p&gt;&lt;div class="vidwrapper&gt;... 中。然而,当谈到 RSS 费用时,我不希望这个 youtube 视频可见,而且它周围的 vidwrapper 也没有任何意义。所以我实际上要做的就是在每个 RSS 项目中去掉这个&lt;p&gt;&lt;div class="vidwrapper&gt;...。我发现一个已经是一个正则表达式,它会删除其中的脚本标签(swf-object javascript)并且效果很好!

标签: php regex preg-replace html-parsing


【解决方案1】:

如果它是固定发生的,那么以下可能会起作用:

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

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

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

【讨论】:

    【解决方案2】:

    使用正则表达式是个坏主意,除非您知道在 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 树上进行搜索。

    另见:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-03-30
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 2010-10-16
        相关资源
        最近更新 更多