我一直在這個關閉幾天,但我的RexEx掌握不是很好。是的,我明白RegEx不適用於解析HTML。我正在做CKEditor輸入的服務器端「清理」,已經這樣做了,但只有客戶端。RegEx查找並刪除事件屬性前。 onclick,onload,onhover等
條帶化沒有列入白名單的標籤後...
第一:$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html);
刪除所有的事件屬性妥善要麼'
或"
報價引述
二:$html = preg_replace(' on\w+=\S+', '', $html);
*刪除沒有引號的那些但仍然可以開火,例如。的onclick = blowUpTheBase()
我想這樣做是保證的onEvent是<
& >
之間,但我只能得到它,如果的onEvent屬性標籤後的第一個工作。我所嘗試的一切最終都會捕獲大部分代碼。我只是不能很懶。
ex。 $html = preg_replace('<([\s\S]?)(on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);
編輯: 我要選擇@ colburton的答案,因爲RegEx是我所要求的。我也會將它用於我的特殊情況,因爲它會應付詭計。 (這無論如何是一個內部應用程序)
但
我要感謝@Casimir等伊波利特他answer,因爲它提供了有關如何做到這一點的「正確的方式」一個很好的例子和說明。我將在短期內使用DOMDocument編寫一個函數,它將成爲我處理RTE/WYSIWYG/HTML輸入的轉換方式。
的'[^ \ 1]'不爲工作你認爲它的確如此。你需要使用'(?:(?!\ 1)。)*'來代替。此外,你應該使用正則表達式分隔符。 –
引用問題和屬性位置是爲什麼用正則表達式解析你的html是一個壞主意的兩個原因。當您使用DOMDocument時,這些問題不存在。將你的HTML內容封裝在假根元素中,假設'
還要注意,你不能信任外部數據,所以如果已經有一部分應該在客戶端完成的清理工作,那麼你必須在服務器端再做一次或者至少檢查一次。 –