2010-10-02 7 views
1

Quelqu'un sait-il d'une bonne expression régulière pour supprimer les événements de html.Javascript Expression régulière [Supprimer événements]

Par exemple la chaîne:
"<h1 onmouseover="top.location='http://www.google.com">Large Text</h1> Devient "<h1>Large Text</h1>
Ainsi balises HTML sont conservés mais des événements comme onmouseover, onmouseout, onclick, etc. sont supprimés.

Merci à l'avance!

+0

-1 (X) HTML est pas une langue régulière. Si vous faites cela comme une sorte de "désinfection", c'est particulièrement dangereux - il peut y avoir quelques cas de bord qui sont analysés comme JavaScript par certains analyseurs de soupe de balises; un candidat évident est les commentaires conditionnels d'IE. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

Répondre

4

Que diriez-vous:

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

Modifier des commentaires:

Ceci est destiné à être exécuté sur votre balisage comme une chose de temps. Si vous essayez de supprimer des événements dynamiquement pendant l'exécution de la page, c'est une histoire légèrement différente. Une bibliothèque javascript comme jQuery rend extrêmement facile, cependant:

$('*').unbind(); 

Edit:

La restriction cela que dans les balises est beaucoup plus difficile. Je ne suis pas sûr que cela puisse être fait avec une seule expression regex. Cependant, cela devrait vous obtenir par si personne ne peut venir avec un:

var matched; 

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

Edit:

Je me rends à écrire une seule regex pour cela. Il doit y avoir un moyen de vérifier le contexte d'un match sans réellement capturer le début de la balise dans votre match, mais mon RegEx-fu n'est pas assez fort. Ceci est la solution la plus élégante, je vais venir avec:

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

très bonne réponse. Juste un commentaire pour James qu'il ne sera pas supprimer les événements sur html qui ont été placés discrètement et aussi il ne supprimera pas certains des événements de clic déclenchés par href = 'javascript: function()' –

+0

Merci d'avoir répondu à Ian. Je remplace juste le HTML cru, ainsi l'expression rationnelle semble bonne. Cependant, existe-t-il un moyen de le spécifier afin qu'il ne corresponde que si la chaîne est dans un tag? actuellement la regex remplacerait "les événements onclick peuvent être écrits comme onclick =" quelque chose "" à "les événements onclick peuvent être écrits comme". Des idées? Merci –

+0

J'apprécie l'effort! Je pense que votre dernière tentative fonctionnera parfaitement pour moi. Je vous remercie :) –

0

est ici une façon JS pur pour le faire:

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