2010-10-02 20 views
1

Кто-нибудь знает о хорошем регулярном выражении, чтобы удалить события из html.Javascript Regular Expression [Удалить события]

Например строка:
"<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 –

ответ

4

Как насчет:

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

Edit от комментариев:

Это предназначено для запуска на разметке, как один раз вещь. Если вы пытаетесь динамически удалять события во время выполнения страницы, это немного другая история. Библиотеку JavaScript, как JQuery делает его очень легко, хотя:

$('*').unbind(); 

Edit:

Ограничение это только внутри тегов намного сложнее. Я не уверен, что это можно сделать с помощью одного выражения регулярного выражения. Тем не менее, это должно получить вас, если никто не может придумать один:

var matched; 

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

Edit:

Я сдаюсь при написании одного регулярного выражения для этого. Должен быть какой-то способ проверить контекст соответствия, не зафиксировав при этом начало тега в вашем матче, но мой RegEx-fu недостаточно силен. Это самое элегантное решение, которое я собираюсь придумать:

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

очень хороший ответ. Просто обратная связь для james, что он не удалит события на html, которые были размещены ненавязчиво, а также не удалит некоторые события щелчка, вызванные через href = 'javascript: function()' –

+0

Спасибо, что ответили на Ian. Я просто заменяю raw html, поэтому регулярное выражение выглядит хорошо. Однако есть ли способ указать его так, чтобы он соответствовал только тому, что строка находится внутри тега? в настоящее время регулярное выражение заменяет «события onclick могут быть записаны как onclick =« что-то »на« события onclick могут быть записаны как ». Есть идеи? Спасибо –

+0

Я ценю усилия! Думаю, твоя последняя попытка будет отлично работать для меня. Спасибо :) –

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; 
}