javascript - regexp - regular expression:
使用JS Regular Expression從html中刪除所有腳本標記 (8)
我想在pastebin中從這個html中刪除腳本標籤
我嘗試使用下面的正則表達式
html.replace(/<script.*>.*<\/script>/ims, " ")
但它不會刪除html中的所有腳本標記。 它只刪除內聯腳本。 請我需要一個可以刪除所有腳本標籤的正則表達式(內聯和多行)。 如果對我的樣本http://pastebin.com/mdxygM0a進行測試,我們將非常感激
謝謝
/(?:(?!</ s \ w)<[^ <] ) </ s \ w * / gi; - 刪除任何組合中的任何序列
以下是各種shell腳本,您可以使用它們去除不同的元素。
# doctype
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<\!DOCTYPE\s\+html[^>]*>/<\!DOCTYPE html>/gi" {} \;
# meta charset
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<meta[^>]*content=[\"'][^\"']*utf-8[\"'][^>]*>/<meta charset=\"utf-8\">/gi" {} \;
# script text/javascript
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<script[^>]*\)\(\stype=[\"']text\/javascript[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
# style text/css
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<style[^>]*\)\(\stype=[\"']text\/css[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
# html xmlns
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxmlns=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
# html xml:lang
find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxml:lang=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
嘗試使用正則表達式刪除HTML標記是有問題的。 你不知道腳本或屬性值是什麼。 一種方法是將其作為div的innerHTML插入,刪除任何腳本元素並返回innerHTML,例如
function stripScripts(s) {
var div = document.createElement('div');
div.innerHTML = s;
var scripts = div.getElementsByTagName('script');
var i = scripts.length;
while (i--) {
scripts[i].parentNode.removeChild(scripts[i]);
}
return div.innerHTML;
}
alert(
stripScripts('<span><script type="text/javascript">alert(\'foo\');<\/script><\/span>')
);
請注意,目前,如果使用innerHTML屬性插入,瀏覽器將不會執行腳本,並且可能永遠不會特別是因為元素未添加到文檔中。
嘗試這個:
var text = text.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/g, "")
在某些情況下,jQuery使用正則表達式刪除腳本標記,我很確定它的開發人員有這麼好的理由。 可能有些瀏覽器在使用innerHTML
插入腳本時會執行腳本。
這是正則表達式:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
在人們開始哭泣之前“但HTML的正則表達是邪惡的”: 是的,它們是 - 但對於腳本標籤,由於特殊行為它們是安全的 - <script>
部分可能根本不包含</script>
,除非它應該結束在這個位置。 因此很容易將它與正則表達式匹配。 但是,從快速查看,上面的正則表達式不會考慮結束標記內的尾隨空格,因此您必須測試</script
等是否仍然有效。
如果要從某些HTML文本中刪除所有JavaScript代碼,則刪除<script>
標記是不夠的,因為JavaScript仍然可以存在於“onclick”,“onerror”,“href”和其他屬性中。
試試這個處理所有這些的npm模塊: https://www.npmjs.com/package/strip-js : https://www.npmjs.com/package/strip-js
每當你不得不求助於基於Regex的腳本標記清理時。 至少在結尾標記中添加一個空格
</script\s*>
否則就像是
<script>alert(666)</script >
標記名有效後,因為尾隨空格會保留。
為什麼不使用jQuery.parseHTML() http://api.jquery.com/jquery.parsehtml/ ?