2015-02-11 102 views
1

使用這個表達式表達幾乎所有的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

回答

1

這應該取代全部不包含「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