【问题标题】:Remove almost all HTML comments using Regex使用 Regex 删除几乎所有 HTML 注释
【发布时间】:2015-02-11 19:53:38
【问题描述】:

使用这个正则表达式:

preg_replace( '/<!--(?!<!)[^\[>].*?-->/', '', $output )

我可以从我的页面中删除所有 HTML cmets,除了如下所示的内容:

<!--[if IE 6]>
    Special instructions for IE 6 here
<![endif]-->

如何修改它以排除包含唯一短语(例如“batcache”)的 HTML cmets?

所以,一个 HTML 注释如下:

<!--
generated 37 seconds ago
generated in 0.978 seconds
served from batcache in 0.004 seconds
expires in 263 seconds
-->

不会被删除。


这段代码似乎可以解决问题:

preg_replace( '/<!--([\s\S]*?)-->/', function( $c ) { return ( strpos( $c[1], '<![' ) !== false || strpos( $c[1], 'batcache' ) !== false ) ? $c[0] : ''; }, $output )

【问题讨论】:

  • 你为什么不使用strip_tags?并添加回特殊的条件 cmets?
  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。请参阅htmlparsing.com/phpthis SO thread,了解如何使用已经编写、测试和调试过的 PHP 模块正确解析 HTML。

标签: php html regex html-parsing conditional-comments


【解决方案1】:

这应该替换所有不包含“batcache”的 cmets。匹配是在这两个标签之间完成的:&lt;!----&gt;

$result = preg_replace("/<!--((?!batcache)(?!\\[endif\\])[\\s\\S])*?-->/", "", $str);

你可以测试一下here

正如其他用户已经说过的那样,使用正则表达式解析 HTML 并不总是安全的,但如果您对解析哪种 HTML 有一定的把握,它应该可以按预期工作。如果正则表达式与某些特定用例不匹配,请告诉我。

【讨论】:

  • 谢谢,这几乎正是我想要的,但是条件注释异常发生了什么?我更新了我的问题以显示我正在工作的代码。此外,我完全理解@AndyLester 所说的关于正则表达式解析的内容,但在这种情况下——具有独特的、不变的条件——我认为没关系。
  • 对不起,我误读了这个问题。我以为您想替换所有标签,但包含 batcache 的标签除外。我已经相应地修改了答案。如果您需要排除更多匹配项,我认为您可以以“(?!字符串)”的格式向列表中添加另一个否定前瞻。
  • 也许[endif] 并不完美,如果您愿意,可以将其替换为&lt;![,就像您的解决方案一样。
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2011-08-17
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多