欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

javascript 過濾 html

吳曉飛1年前5瀏覽0評論

JavaScript 作為一門的腳本語言,常常用來操作瀏覽器中的DOM元素。但是在網頁內容中,我們很難完全信任用戶輸入和從后端獲取到的數據。而在一些網站中,我們會使用富媒體編輯器或者markdown編輯器,用戶的輸入內容往往是包含 HTML 標簽的。而這種輸入可能會導致一些安全問題,比如跨站腳本攻擊(XSS)。所以在很多場景下,我們需要對用戶輸入或者后端返回的數據進行過濾,消除其中的 HTML 標簽。

在實際使用中,我們可能會使用一些類庫來自動完成這個過程,比如 jQuery、AngularJS,或者 React,它們都有自己的過濾器或者標簽來進行 HTML 標簽的消除。但是這些類庫可能會對代碼大小、性能以及依賴關系造成一定的影響。因此,我們有必要了解原生JavaScript如何實現該功能。

我們可以使用正則表達式來完成 HTML 標簽的過濾。下面這個函數可以將所有 HTML 標簽過濾掉,僅返回純文本:

function filterHTMLTags(str) {
return str.replace(/<[^>]+>/g, '');
}

牽扯到正則表達式,上個例子可能有點讓人困惑。但是實際上,正則表達式就是一個標記(或一組標記),它們可以幫助我們查找文本中的特定模式。上述的正則表達式/\<[^>]+\>/g就是標記,其中/g符號代表匹配所有的,而/\<[^>]+\>/則指示任何的標簽。這里的\< 匹配了字符 '<', \>匹配了 '>',[^>]+則代表任何除 '>' 以外的字符。

可是上述實現存在一定的問題,任何的鏈接、腳本、樣式等標簽同樣會去除掉,這種情況并不理想。因此,進行更嚴格的過濾,需要對需要的標簽進行白名單判斷,這個判斷會針對每一種特定的場景進行配置。例如,如果我們的場景需要保留 a 標簽,這時候我們應該怎么做呢?

function filterHTMLTags(str) {
return str.replace(/<(?!a)[^>]+>/gi, '');
}

在正則表達式中,使用負向前瞻,可以指定一個標簽不應該被過濾掉。在上面的例子中,只要沒被匹配上,所有的 HTML 標簽都會被去除。我們還可以使用其他標簽,要求過濾器保留需要的標簽,類似于這樣:

function filterHTMLTags(str) {
return str.replace(/<(p|br|b|a)[^>]+>/g, function(match, p1) {
return '<' + p1 + '>';
});
}

在上面的例子中,所有的標簽都會被過濾,只留下 p,br,b,a 標簽。需要注意的是,在函數的第二個參數中,$1 代表查找的結果,具體來說就是表示括號匹配的第一個值(p,br,b,a)。這樣就可以保證只有被允許的標簽被返回。

最后,需要提醒的是,對于已經過濾完畢后的代碼,我們不能完全信任它,因為盡管所有的標簽都已經被去除,惡意代碼仍然可以通過其它方式來執行。比如,JavaScript的偽協議可以將代碼執行!因此,在對用戶輸入以及后端傳輸數據進行過濾的時候,必須要采用其他措施,比如輸入校驗和嚴格驗證后臺返回的內容。