0

好的,所以我正在尝试制作一个笑脸数组,问题是它将在 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;
}

请注意,函数本身没有任何问题,我在数组中只使用了 1 个简单的笑脸来尝试它。

4

4 回答 4

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));
于 2013-11-09T16:34:05.857 回答
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;
}
于 2013-11-09T16:37:11.553 回答
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"
于 2013-11-09T17:14:59.213 回答
0

在将它们添加到正则表达式之前,还有更多特殊字符(需要转义。

在堆栈溢出中已经有一个关于如何在将这些字符发送到正则表达式之前对其进行转义的问题,您可以在此处查看: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否则它将在全局命名空间中可用,这不是一件好事(建议阅读:什么是 var 关键字的目的以及何时使用它(或省略它)?) .

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

于 2013-11-09T16:40:19.053 回答