2016-04-21 81 views
1

我正在嘗試接受HTML輸入的textarea字數。來自HTML的JQuery字數和剝離標籤

我的第一步是從輸入中去除標籤。我發現這個代碼another question

$("<div></div>").html(html).text(); 

偉大的工程,但在html易受腳本標籤:

html = "<script>alert()"; 

我試圖通過使用來緩解這樣的:

$("<p>").html(html).remove('script').text(); 

哪個成功處理了上面的例子。不幸的是,它不處理:

html = "<script><script>alert();</script>"; 

因爲它只刪除外部腳本。

我正在嘗試編寫一個while循環來不斷刪除腳本,直到沒有剩下要刪除,但我正在努力與邏輯。

我想是這樣的:

var $div = $("<div></div>").html(html); 
while(*remove script causes a change*){ 
    $div = $div.remove('script'); 
} 
text = $div.text(); 

這可能嗎?這安全嗎?

有沒有辦法在其他元素中處理onXXX=""屬性呢?

+0

「這安全嗎?」滾動你自己的HTML消毒?一點都不。使用經過徹底測試的白名單。你完全錯過了''這樣的東西。 – zzzzBov

+0

@zzzzBov謝謝,是的,我加了這個問題..任何想法,我會找到這樣的白名單? – Arth

+0

這是一個無關緊要的問題。使用谷歌。 – zzzzBov

回答

3

您可以使用正則表達式:

var regex = /(<([^>]+)>)/ig 
var body = "<p>test</p>" 
var result = body.replace(regex, ""); 

alert(result); 

發現了我們另一個答案在計算器上: How to strip HTML tags from div content using Javascript/jQuery?

請保存到數據庫中之前消毒的字符串。

+0

謝謝,但那不處理某些有效的字符串,我寧願不使用正則表達式,如果可能的話。 – Arth

0

我決定使用phpjs版本的php函數strip_tags,這似乎很好地工作,並很好地處理腳本標記。

我簡單的字計數功能到目前爲止是:

$('#input').on('input',function(){ 
    var text = $(this).val(); 
    text = strip_tags(text).replace(/\s+/g, ' ').trim(); 
    var wordCount = 0; 
    if(text != ''){ 
     var words = text.split(' '); 
     wordCount = words.length; 
    } 

    $('#word-count').html(wordCount); 
});