Регулярное выражение Javascript [Удалить события] - PullRequest
2 голосов
/ 02 октября 2010

кто-нибудь знает хорошее регулярное выражение для удаления событий из HTML.

Например, строка:
"<h1 onmouseover="top.location='http://www.google.com">Large Text</h1> Становится "<h1>Large Text</h1>
Таким образом, теги HTML сохраняются, но такие события, как onmouseover, onmouseout, onclick и т. д. удаляются.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 02 октября 2010

Как насчет:

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

Редактировать из комментариев:

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

$('*').unbind();

Edit:

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

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 голосов
/ 02 марта 2015

Вот чистый способ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...