【问题标题】:preg_replace div (or anything) with class=removeMepreg_replace div(或任何东西)与 class=removeMe
【发布时间】:2011-03-01 18:02:32
【问题描述】:

只是尝试使用 preg_replace 删除一些元素,但无法使其始终如一地工作。我想删除一个具有匹配类的元素。问题是元素可能有一个 ID 或多个类。

即元素可以是

<div id="me1" class="removeMe">remove me and my parent</div> 

<div id="me1" class="removeMe" style="display:none">remove me and my parent</div>

可以这样做吗?

任何帮助表示赞赏!丹。

【问题讨论】:

  • 您不想使用正则表达式进行 html 操作。更好的方法是将 html 加载到 DOM 系统中并从那里删除 div 节点。否则,您很可能会完全破坏文档,因为正则表达式无法以 100% 的准确度保证正确处理 HTML。
  • 您可以使用 jQuery .hasClass() 轻松做到这一点
  • @Marc B - 我建议这样回答,这将是正确的方法。

标签: php html preg-replace


【解决方案1】:

我同意 MarcB 的观点。总的来说,在处理 HTML 时最好使用 DOM。但这里有一个基于 smottt 答案的正则表达式,它可能有效:

$html = preg_replace('~<div([^>]*)(class\\s*=\\s*["\']removeMe["\'])([^>]*)>(.*?)</div>~i', '', $html);
  • 使用[^&gt;]*[^&lt;]* 而不是.*。在我的测试中,.*? 不起作用。如果不匹配的 div 出现在匹配的 div 之前,它将匹配第一个 div、其间的所有内容和最后一个 div。例如,它错误地匹配整个字符串:&lt;div&gt;&lt;/div&gt;&lt;b&gt;hello&lt;/b&gt;&lt;div class="removeMe"&gt;bar&lt;/div&gt;
  • 考虑到您可以在 HTML 属性中使用单引号。
  • 还要记住,等号周围可以有空格。
  • 您也应该使用“m”修饰符,以便将换行符考虑在内(请参阅this page

为了清楚起见,我添加了括号,但它们不是必需的。让我知道这是否有效。

编辑:实际上,没关系,“m”修饰符不会做任何事情。 EDIT2:改进了正则表达式,但如果 div 中有任何换行符,它仍然会失败。

【讨论】:

  • thanx michael - 每个人都对 dom 的看法是正确的,但我只是想使用 preg-replace 修改 wordpress 中的现有函数。我真的只是想更好地理解这一点。任何人发布的内容都没有奏效?!不确定我的环境是否会影响它,但这适用于图像: $content = preg_replace("/]+\>/i", "", $content);只需要添加类匹配位并将其更改为 div。我就是看不懂,试了这么多版本!
  • 您使用的 HTML 是什么样的?在我的测试中,我的正则表达式运行良好。您确定在将其插入代码时没有对其进行修改吗?例如,正则表达式不能像 PHP 中的大多数正则表达式一样包含在“/”字符中,因为正则表达式本身中有一个“/”字符。此外,在您的“img”标签正则表达式中,您在“>”之前有一个反斜杠??这是关于什么的?
  • 其实,如果有任何标签嵌套在 div 中,就会出现问题。上面的编辑版本工作得更好一些,但如果 div 中有任何换行符,则由于某种原因会失败。我将 div 正文中的“([^
【解决方案2】:

虽然这对于正则表达式仍然是可行的,但它更简单,例如QueryPath:

print qp($html)->find(".removeMe")->parent()->remove()->writeHTML();

【讨论】:

    【解决方案3】:

    使用 preg_replace:

    preg_replace('~<div([^>]*)class="(.*?)gallery(.*?)">(.*?)</div>~im', '', $html);
    

    【讨论】:

    • 这不考虑多个类。另外,您想通过将 .* 更改为 .* 来使用非贪婪模式?
    • 它应该使用[^&gt;]* 而不是贪婪的.*?,否则它会匹配太多。
    • 好的 - 感谢您的回复 - 现在知道了,但它不起作用? $content = preg_replace('~
      ~i', '', $content); 基本上是想去掉一个gallery元素在它尝试加载任何东西之前。如果是 pos,宁愿尝试避免使用 jquery。元素的示例是 。谢谢, D.
    • 感谢您的指正。 @Daniel,正则表达式现在应该是 ~
      ]*)class="(.*?)gallery(.*?)">(.*?)
      ~i 如果我不是弄错了。
    • 您可能还需要添加多行支持:
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签