我最終會回答你的問題,讓我得到你即將當你還沒有說做主持,雖然
這樣的解釋,我不明白爲什麼你會想要做到這一點。從用戶收集原始html並在其他地方顯示它被認爲是一個巨大的安全漏洞。使用純粹的正則表達式來擺脫所有的javascript將會很困難。清除腳本標記很容易,但刪除內聯JavaScript將是困難的部分。雖然有可能,我會建議尋找另一種方式來進行比給用戶的網頁的JavaScript的剝離版本之外的其他任務。你可以做到這一點
一種方式是通過iframe。使用
<iframe src="html_you_want_to_strip" sandbox=""></iframe>
將禁用在iframe中運行的所有javascript。請記住,還有其他方式可以在不使用JavaScript的情況下將惡意項目加載到您的網站中。
現在,我已經解釋了,當談到剝JavaScript,以便回答你的問題,你應該做的,
A.刪除只從身體腳本標記,只是頭:
最好刪除javascript時獲得粒度的方法是使用PHP的DOMDocument類。基本上,你會了將文檔裝入此DOMDocument類剝奪你想要的任何腳本標記它。例如,如果你只是想擺脫在體內的腳本標籤,你可以寫這樣的事情:
<?php
$html = "the HTML you want filtered";
$DOM = new DOMDocument('1.0','utf-8');
$DOM->loadHTML($html);
$bodyTags = $DOM->getElementsByTagName('body');
/*
We will run under the assumption that the user has the ability to add two
body tags and hide information in the second one, that is why we don't
just use $DOM->getElementsByTagName('body')[0]
*/
foreach($bodyTags as $body){
foreach($body->getElementsByTagName('script') as $script){
$script->parentNode->removeChild($script);
/*
The reason we have to this is because you cant just do
$script->remove(), that would be too easy :)
*/
}
}
相同的代碼上面可以用來剝去頭標記的腳本。如果您想刪除具有特定索引的項目,則可以使用您的foreach執行以下操作:
$i=0;
foreach($body->getElementsByTagName('script') as $script){
if($i!==(INDEX_TO_KEEP)){
$script->parentNode->removeChild($script);
}
}
B.刪除內聯javascript
我們可以使用相同的DOMDocument解析器,除了解析所有元素,這次查找所有JavaScript事件(謝天謝地所有的開始)。代碼如下所示。
<?php
//starting where the last code leaves off
foreach($DOM->getElementsByTagName('*') as $element){
//This selects all elements
foreach($element->attributes as $attribute){
if(preg_match('/on.*/',$attribute)==1){
/*
"on" looks for on and ".*" states that there
can be anything after the on (onmousemove,onload,etc.)
*/
$element->removeAttribute($attribute)
}
}
}
在你的代碼的最後,您將要保存的剝離HTML,然後返回給用戶
$parsedHTML = $DOM->saveHTML()
「答案我喜歡關於這一主題的最多的是從平」 - 殤它不起作用。 https://pastebin.com/t28dn6Zt – Quentin