2010-10-02 39 views
1

沒有人知道一個很好的正則表達式來從html中移除事件。Javascript正則表達式[Remove Events]

例如字符串:
"<h1 onmouseover="top.location='http://www.google.com">Large Text</h1> 變爲 "<h1>Large Text</h1>
所以HTML標記將得以保留,但喜歡的onmouseover,的onmouseout,的onclick等事件都被刪除。

在此先感謝!

+0

-1(X)HTML是不是一個正規的語言。如果你這樣做是爲了某種「消毒」,那麼特別不安全 - 可能會有某些邊緣情況被某些標記湯解析器解析爲JavaScript;一個明顯的候選人是IE的條件評論。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-10-02 02:30:38

回答

4

如何:從註釋

data.replace(/ on\w+="[^"]*"/g, ''); 

編輯:

這是爲了在您的標記作爲一個時間的事情運行。如果你想在頁面執行期間動態地移除事件,那是一個稍微不同的故事。像jQuery JavaScript庫使得它非常容易,但:

$('*').unbind(); 

編輯:

僅在標籤限制這是一個困難得多。我不確定它可以用一個單一的正則表達式來完成。然而,這應該,如果沒有人能拿出一個讓你:

var matched; 

do 
{ 
    matched = false; 
    data = data.replace(/(<[^>]+)(on\w+="[^"]*")+/g, 
     function(match, goodPart) 
     { 
      matched = true; 
      return goodPart; 
     }); 
} while(matched); 

編輯:

我在寫一個正則表達式這個投降。必須有一些方法來檢查比賽的上下文,而不是實際捕獲比賽中標籤的開始,但是我的RegEx-fu不夠強大。這是最優雅的解決方案我要拿出:

data = data.replace(/<[^>]+/g, function(match) 
{ 
    return match.replace(/ on\w+="[^"]*"/g, ''); 
}); 
+0

非常好的答案。只是對詹姆斯的反饋,它不會刪除已經放置在不顯眼的html上的事件,也不會刪除通過href ='javascript:function()'觸發的一些點擊事件。 – 2010-10-02 01:10:29

+0

謝謝你回答Ian。我只是更換原始html,所以正則表達式看起來不錯。然而,有沒有一種方法來指定它,以便它只有在字符串在標籤內時才匹配?目前正則表達式將取代「onclick事件可以寫成onclick =」某事「」到「onclick事件可以寫成」。有任何想法嗎?謝謝 – 2010-10-02 01:34:44

+0

我很欣賞努力!我認爲你的最終嘗試對我來說是完美的。謝謝 :) – 2010-10-02 05:51:39

0

這裏是一個純JS的方式來做到這一點:

function clean(html) { 
    function stripHTML(){ 
     html = html.slice(0, strip) + html.slice(j); 
     j = strip; 
     strip = false; 
    } 
    function isValidTagChar(str) { 
     return str.match(/[a-z?\\\/!]/i); 
    } 
    var strip = false; //keeps track of index to strip from 
    var lastQuote = false; //keeps track of whether or not we're inside quotes and what type of quotes 
    for(var i=0; i<html.length; i++){ 
     if(html[i] === "<" && html[i+1] && isValidTagChar(html[i+1])) { 
      i++; 
      //Enter element 
      for(var j=i; j<html.length; j++){ 
       if(!lastQuote && html[j] === ">"){ 
        if(strip) { 
         stripHTML(); 
        } 
        i = j; 
        break; 
       } 
       if(lastQuote === html[j]){ 
        lastQuote = false; 
        continue; 
       } 
       if(!lastQuote && html[j-1] === "=" && (html[j] === "'" || html[j] === '"')){ 
        lastQuote = html[j]; 
       } 
       //Find on statements 
       if(!lastQuote && html[j-2] === " " && html[j-1] === "o" && html[j] === "n"){ 
        strip = j-2; 
       } 
       if(strip && html[j] === " " && !lastQuote){ 
        stripHTML(); 
       } 
      } 
     } 
    } 
    return html; 
}