删除使用正则表达式

问题描述:

使用这个表达式表达几乎所有的HTML注释:删除使用正则表达式

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

我能够从我的网页中删除所有HTML注释除了任何看起来像这样:

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

如何我可以修改它以排除包含唯一短语(如“batcache”)的HTML注释吗?

所以,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) 
+0

你为什么不使用'strip_tags'?并添加特殊的条件注释? – 2015-02-11 19:55:44

+2

**不要使用正则表达式来解析HTML。使用合适的HTML解析模块**您无法可靠地使用正则表达式解析HTML,并且您将面临悲伤和挫折。只要HTML从你的期望改变,你的代码就会被破坏。请参阅http://htmlparsing.com/php或[this SO thread](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php)如何使用已经编写,测试和调试的PHP模块正确解析HTML的示例。 – 2015-02-11 19:56:37

这应该取代全部不包含“batcache”的评论。匹配在这两个标签之间完成:<!---->

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

您可以试一试here

正如其他用户指出的那样,使用正则表达式解析HTML并不总是安全的,但是如果您有相对保证将分析哪种HTML的应该按预期工作。如果正则表达式不匹配某个特定的用例,请告诉我。

+0

谢谢你,这几乎和我一直在寻找的东西一样,但是条件注释例外发生了什么?我更新了我的问题以显示我工作的代码。另外,我完全理解@AndyLester对正则表达式解析的看法,但在这种情况下 - 具有独特且不变的条件 - 我认为它是可以的。 – Rich 2015-02-11 21:57:22

+0

对不起,我误解了这个问题。我以为你想替换除了包含batcache的标签之外的所有标签。我相应地修改了答案。如果你需要更多的匹配排除,我认为你可以在“(?!string)”格式的列表中添加另一个负向预览。 – ntrp 2015-02-11 22:11:09

+0

也许'[endif]'这并不完美,如果你愿意的话,你可以用' ntrp 2015-02-11 22:16:36