【问题标题】:Remove all empty tags except specified删除除指定之外的所有空标签
【发布时间】:2012-12-27 07:57:51
【问题描述】:

以下 PHP 正则表达式删除所有空标签:

#<[^\/>]*>([\s]?)*<\/[^>]*>#u

我想删除不匹配的空标签:

<div style="clear:both"></div>

我试过了:

#^(<div style="clear:both"></div>)<[^\/>]*>([\s]?)*<\/[^>]*>#u

...但是没有用。

如何添加否定句?

【问题讨论】:

  • 使用正则表达式不简单地解析/处理 HTML。
  • 你在混淆^。这意味着主题或行的开始。你需要一个断言(?!...)
  • HTML 不是常规语言。在某些情况下,结束标签允许missing。换句话说,即使缺少特定的结束标记,HTML 文档也可以被认为是格式正确的。这使得搜索空标签变得更加困难。
  • @TylerCrompton 我的 html 是由 php 脚本生成的,所以在我的情况下使用正则表达式非常好。请在 dom html 解析器上查看我的 cmets。
  • @PeeHaa 你说得对:这显然是为了好玩。我不知道在给定内置 dom 处理器的情况下,我是否真的会使用正则表达式。我只知道我一直在编辑 vi 中的 HTML 文件,而且当我这样做时,我从不回避使用 s/foo/bar/ 类型替换。我认为这里的人们经常过度设计一些随时随地都能工作的解决方案,而不是只做需要做的事情来处理当前任务并回家。

标签: php regex html-parsing regex-negation


【解决方案1】:

假设它是格式良好的并且没有丢失的结束标签,这应该可以解决问题:

<(?!div\s+style=(?:"[^"]*?\bclear:\s*both\b[^"]*"|'[^']*?\bclear:\s*both\b[^']*')\s*>\s*</div>).*?>\s*</.*?>

确保也使用不区分大小写标志。不过,我仍然建议不要这样做。

编辑:我没有测试我的编辑,但我相当有信心它会更彻底。

【讨论】:

  • 如何将它与我的正则表达式结合起来?
  • @jason,您介意提供几个应该和不应该匹配的示例列表吗?除了匹配大多数空标签之外,我不确定您到底想做什么。
  • 这么复杂,你不用正则解析html