JavaScript RegEx表情符号

时间:2013-11-09 16:17:26

标签: javascript regex

好吧所以我正在尝试制作一个smilie数组,问题是它会出现在JavaScript中,而且因为奇怪的字符而出错。

这是我的错误:[17:14:57.025] SyntaxError:unterminated parenthetical 这是代码行:

var smiley_array = [':)',';)',':P',':D',':O',':(',':\'(',':|',':/',':$',':@','(A)','3:)',':cool:',':*',':lol:',':z'];

我知道在某些地方必须在角色面前加上反斜杠,而且我一直在尝试我能想到的一切。

感谢。

编辑:

var smiley_array = [':)',';)',':P',':D',':O',':(',':\'(',':|',':/',':$',':@','(A)','3:)',':cool:',':*',':lol:',':z'];
var smiley_xhtml = ['smile','wink','raspberry','big_smile','surprise','sad','crying','plain','worried','embarrassed','angry','angel','devil','cool','kiss','laugh','tired'];

function smilies(text) {
    for (var i = 0; i< smiley_array.length; i++) {
        word = smiley_array[i].replace(")","\\)");
        word = new RegExp(word, "g");
        var smiley_img = '<img style="margin-bottom: -3px;" height="20px" width="20px" src="<?php echo $this->x7->smilie_url; ?>' + smiley_xhtml[i] + '.png" />';    
        text = text.replace(word, smiley_img);
    }
return text;
}

请注意,它自身的功能没有任何问题,我在阵列中只用了一个简单的笑脸来尝试它。

4 个答案:

答案 0 :(得分:1)

您可以将数组转换为正则表达式,如下所示:

var smiley_array = [':)',';)',':P',':D',':O',':(',':\'(',':|',':/',':$',':@','(A)','3:)',':cool:',':*',':lol:',':z'];

for(var i = 0; i < smiley_array.length; i++){
    smiley_array[i] = smiley_array[i].replace(/([)(*|$])/g, '\\$1'); //This will add backslashes before ), (, *, |, and $
}
var regex = new RegExp(smiley_array.join('|'), 'g');

然后将其应用于文本:

var test = 'Lorem ipsum :) dolor sit ;) amet, consectetur :P adipiscing :D elit :O. Integer :( ac urna ultrices, :\'( tincidunt :| lectus :$ suscipit, :cool: sagittis :@ tortor. (A) Donec eu 3:) metus :/ aliquam :lol: velit :* elementum :z pulvinar';

console.log(test.match(regex));

答案 1 :(得分:1)

在笑脸阵列中使用此代码引用特殊的正则表达式字符

string = string.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");

您的完整代码:

var smiley_array = [':)',';)',':P',':D',':O',':(',':\'(',':|',':/',':$',':@','(A)','3:)',':cool:',':*',':lol:',':z'];
var smiley_xhtml = ['smile','wink','raspberry','big_smile','surprise','sad','crying','plain','worried','embarrassed','angry','angel','devil','cool','kiss','laugh','tired'];

function smilies(text) {
    for (var i = 0; i< smiley_array.length; i++) {
        str = smiley_array[i].replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
        word = new RegExp(word, "g");
        var smiley_img = '<img style="margin-bottom: -3px;" height="20px" width="20px" src="<?php echo $this->x7->smilie_url; ?>' + smiley_xhtml[i] + '.png" />';    
        text = text.replace(word, smiley_img);
    }
    return text;
}

答案 2 :(得分:0)

除了(之外,还有更多特殊字符需要在您在正则表达式中添加之前进行转义。

Stack Overflow中已经有一个关于如何在将这些字符发送到正则表达式之前将其转义的问题,你可以在这里看到它:Escape string for use in Javascript regex

我调整了您的smilies函数,以使用我在上面提到的问题中提供的函数。

function smilies(text) {
    for (var i = 0; i< smiley_array.length; i++) {
        var word = new RegExp(escapeRegExp(smiley_array[i]), "g");
        var smiley_img = '<img style="margin-bottom: -3px;" height="20px" width="20px" src="<?php echo $this->x7->smilie_url; ?>' + smiley_xhtml[i] + '.png" />';

        text = text.replace(word, smiley_img);
    }

    return text;
}

我还在var函数之前添加了word关键字,否则它将在全局命名空间中可用,这不是一件好事(建议阅读:What is the purpose of the var keyword and when to use it (or omit it)?)。

小提琴:http://jsfiddle.net/d9X4P/

答案 3 :(得分:0)

我知道,我不在话题,只是为了分享:$

var smilies = { 
    smile: /:\)/g, 
    bigsmile: /:D/g, 
    worried: /:\//g 
};

var txt = ':) :D :) :/';
for (var k in smilies) {
    txt = txt.replace(smilies[k], k);
}
txt; // "smile bigsmile smile worried"