Расширенные регулярные выражения в Javascript

Я разрабатываю несколько расширенных выражений, которые обнаруживают 4 вещи: URL-адреса, имена пользователей в твиттере, хэштеги и шестнадцатеричные цвета. Это хорошо работает, если вы поставите одну и ту же вещь, например, 4 разных хэштега, URL или цвета. Но когда вы ставите, например, хэштег и другую вещь, такую ​​как URL, хэштег исчезает. Здесь вы можете увидеть RegularExp:

var RegularExp = {
    twitter: /(^|[,\s])@(\w{1,15})/g,
    color: /(^|[,\s])#((?:[a-fA-F0-9]){3}|(?:[a-fA-F0-9]){6})/g,
    hashtag: /(^|[,\s])#(\w{1,15})/g,
    url: /(^|\s)(((http(s)?:\/\/|ftp(s)?:\/\/)?([a-zA-Z0-9_-]+\.)?(?:[a-zA-Z0-9]+)(?:\.[a-z]{2,4}){1,2})(\/.*)*)/g
},
Replacer = {
    twitter: "$1<a rel='nofollow' target='_blank' href='http://twitter.com/$2'>@$2</a>",
    color: "$1<span class='hex-color' style='background-color:#$2 !important'>#$2</span>",
    hashtag: "$1<a rel='nofollow' target='_blank' href='http://twitter.com/search?q=%23$2&src=hash'>#$2</a>",
    url: "$1<a rel='nofollow' target='_blank' href='$2'>$2</a>"
};

Вы можете попробовать здесь: http://jsfiddle.net/esa_u7/KrTMW/ Напишите в первой текстовой области: "#fff, #000, #00f" без слешей (как вы можете видеть, это сработало), а затем добавьте имя пользователя в твиттере. как @example. Почему все хэштеги исчезают.

2 ответа

Я нашел ошибку. Я делал петлю как:

$.each(RegularExp, function (name, value) {
    if (RegularExp[name].test(self.nodeValue)) {
        $(self).replaceWith(self.nodeValue.replace(RegularExp[name], Replacer[name]));
    }
    $output.find("span").each(function () {
        if ($(this).hasClass("hex-color")) {
            $(this).contrastColor("color", "background-color");
        }
    });
});

И правильный способ сделать это:

var indice = 1,
    texto = this.nodeValue;
$.each(RegularExp, function (name, value) {
    if (RegularExp[name].test(self.nodeValue)) {
        texto = texto.replace(RegularExp[name], Replacer[name])
    }
    if(indice == Object.keys(RegularExp).length){
        $(self).replaceWith(texto);
    }
    $output.find("span").each(function () {
        if ($(this).hasClass("hex-color")) {
            $(this).contrastColor("color", "background-color");
        }
    });
    indice++;
});

Хеш-теги могут использоваться как разделители регулярных выражений и должны быть экранированы \#

Другие вопросы по тегам