2011-07-07 110 views
3

我正在尋找一種方法來從HTML字符串中刪除所有的JavaScript標籤。PHP的正則表達式,以刪除所有的JavaScript異常

以下的正則表達式工作正常,但我想補充一個例外:

$html = preg_replace('#<script[^>]*>.*?</script>#is', '', $html); 

我如何添加一個類型text/html的腳本越來越忽略的規則?

<script type="text/html" ... > ... </script> 

有什麼建議嗎?

在此先感謝。

+3

使用HTML解析器,而不是正則表達式:http://php.net/manual/en/book.dom.php – PeeHaa

+0

酷,這就是我無論如何正在做。此時使用Zend_Dom_Query。你有沒有想到xpath的選擇器是怎麼樣的? – Mayko

+0

'preg_replace'不允許您在正則表達式中指定'e'標誌,以便將替換字符串視爲代碼。你不能用替換表達式來查找'type =「text/html」',如果它存在,則返回整個腳本標記,否則返回空白。 –

回答

3

你可能不試圖消毒不可信的HTML,而只是使這個問題的讀者不要錯誤的想法:<img src=bogus onerror=alert(42)>

這不會外<script>元素刪除的JavaScript。

它不會刪除幾乎不混淆的腳本:<script>alert(42)</script >

它會將無效內容轉換爲腳本:<scrip<script></script>t>alert(42)</script>

我不是說這就是你想要做的。您可能完全有理由這樣做,這與不受信任的輸入無關,但對於後來的讀者,請勿嘗試僅使用正則表達式來推出自己的HTML清理程序。

+0

良好的評論和你是對的,但說實話我並不是太過分了。 ;) 我不想刪除內聯腳本。它更多關於這個例外。 – Mayko

1

使用,將不屬於小李的指針,像這樣一個貪婪的比賽:

$html = preg_replace('#<script.*</script>#is', '', $html); 

這應該(貪婪)匹配所有腳本標記。至於例外情況,我不知道該怎麼做,對不起。

+0

這個正則表達式不起作用,您需要轉義\或更改分隔符。 –

+0

如果頁面在頁面的頭部和底部附近都有腳本標記,則此正則表達式將幾乎刪除整個頁面。 – mikel

+0

那麼這是一個設計不佳的頁面。 –

相關問題