Regex съответстващ списък на емотикони от различен тип

Трябва да създам функционалност, която ще ми позволи да анализирам текст, търсейки съвпадение за низ от емотикони в различен формат. Може да бъде емотикон тип :) или тип &lt;dog&gt; (<dog>). В момента моята функция може да намери и двата типа, но се нуждае от два различни регулярни израза за тази задача и бих искал да го направя само с една стъпка. Някакви идеи ?

Пример на живо в jsfiddle: http://jsfiddle.net/rmQSx/5/

и кода:

function replaceEmoticons(text) {
    var emots1 = {
        ':)': 'smile.gif',
        ':(': 'sad.gif',
    },
    emots2 = {
        '&lt;dog&gt;': 'dog.gif',
        '&lt;fly&gt;': 'fly.gif'   
    },
    regex1,regex2,p,re;


    for(p in emots1){
        regex1 = "["+p+"]{2}";
        re = new RegExp(regex1, "g");

        text = text.replace(re, function (match) {
            return typeof emots1[match] != 'undefined' ?
                '<img src="'+emots1[match]+'"/>' :
                match;
        });
    }

    for(p in emots2){
        regex2 = "("+p+")(|$)";
        re = new RegExp(regex2, "g");

        text = text.replace(re, function(match) {
            return typeof emots2[match] != 'undefined' ?
                '<img src="'+emots2[match]+'"/>' :
                match;
        });
    }

     return text;   
}

console.log(replaceEmoticons('this is &lt;dog&gt;b a&lt;fly&gt; simple test :) , ;)   and more:):('));

person mikeTa    schedule 06.09.2011    source източник


Отговори (2)


Почти съм сигурен, че нямате нужда от забавните неща, които правите в началото на всеки цикъл for, за да модифицирате регулярния израз. Отървете се от това и нищо не ви пречи да обедините двата комплекта.

Вие обаче трябва да избягвате специалните символи ( и ) във вашите усмивки, когато правите регулярните изрази. Също така бих предложил да направите търсенето с регулярен израз без значение за малки и големи букви, така че <dog> и <DOG> да съвпадат.

//helper function to escape special characters in regex
function RegExpEscape(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
}

function replaceEmoticons(text) {   
    var emots = {
        ':)'         : 'smile.gif',
        ':('         : 'sad.gif',
        '&lt;dog&gt;': 'dog.gif',
        '&lt;fly&gt;': 'fly.gif'
    }

    var result = text;
    var emotcode;
    var regex;

    for (emotcode in emots)
    {
        regex = new RegExp(RegExpEscape(emotcode), 'gi');
        result = result.replace(regex, function(match) {
            var pic = emots[match.toLowerCase()];

            if (pic != undefined) {
                return '<img src="' + pic + '"/>';
                    } else {
                return match;
                    }
                });
    }

    return result;    
}
person Brian L    schedule 06.09.2011

използвай |

можете да направите нещо като:

re = new RegExp(smiley1|smiley2|...|smileyN);
person Packet Tracer    schedule 06.09.2011