如何用javascript替换字符串?

时间:2010-06-17 10:15:25

标签: javascript

我有这个功能:

function emoticons(text){
    var url = "http://www.domain.it/images/smilies/";
    var emt = {
       ":D"  : 'icon_e_biggrin.gif',
       ":-D" : 'icon_e_biggrin.gif',       
       ":)"  : 'icon_e_smile.gif',
       ":-)" : 'icon_e_smile.gif',       
       ";)"  : 'icon_e_wink.gif',
       "';-)" : 'icon_e_wink.gif',

       ":("  : 'icon_e_sad.gif',
       ":-(" : 'icon_e_sad.gif',
       ":o"  : 'icon_e_surprised.gif',
       ":?"  : 'icon_e_confused.gif',
       "8-)" : 'icon_cool.gif',

       ":x"  : 'icon_mad.gif',
       ":P"  : 'icon_razz.gif'
    };

    for (smile in emt){        
        text   = text.replace(smile, '<img src="' + url + emt[smile] + '" class="emoticons" />');
    }

    return (text);
}

如你所知.replace()转换第一次出现,如何在文本中替换多个表情符号?如何更改此功能?

非常感谢!

3 个答案:

答案 0 :(得分:4)

您可以将每个表情符号字符串翻译为全局正则表达式,当与String#replace方法一起使用时,它将替换所有出现的表达式:

function emoticons(text){
  var url = "http://www.domain.it/images/smilies/";
  var emt = {
    /\:D/g:   'icon_e_biggrin.gif',
    /\:\-D/g: 'icon_e_biggrin.gif',
//...

尽管如此,你必须小心逃避表情文本中的特殊字符。

答案 1 :(得分:3)

maerics' answer对您现有的功能进行相当小的更改,应该可以解决这个问题。但是,如果你正在进行这些替换的文本很大,你可能会考虑在他们的头上翻转并使用正则表达式替换和替换函数。

正则表达式替换如下所示:/A|B|C/,它告诉正则表达式引擎看A B C.您给{{1}的函数接收匹配的文本作为参数,然后它可以在地图中查找相关的替换:

String#replace

这样做只允许你循环遍历字符串一次并构建一个替换字符串,而不是为每个笑脸循环遍历它并构建多个临时字符串。

对于一小部分文本来说无关紧要,复杂性(在两个不同的地方保持每个笑脸)可能不值得,但对于大文本来说可能是不值得的。

答案 2 :(得分:2)

另一个解决方案是为每个字符串创建一个带有“g”修饰符的RegExp。由于此函数可能会多次运行par pageload,因此您应该只创建emt和regexp一次:

var emoticons = (function () {
    var url = "http://www.domain.it/images/smilies/";
    var emt = {
       ":D"  : 'icon_e_biggrin.gif',
       ":-D" : 'icon_e_biggrin.gif',       
       ":)"  : 'icon_e_smile.gif',
       ":-)" : 'icon_e_smile.gif',       
       ";)"  : 'icon_e_wink.gif',
       "';-)" : 'icon_e_wink.gif',

       ":("  : 'icon_e_sad.gif',
       ":-(" : 'icon_e_sad.gif',
       ":o"  : 'icon_e_surprised.gif',
       ":?"  : 'icon_e_confused.gif',
       "8-)" : 'icon_cool.gif',

       ":x"  : 'icon_mad.gif',
       ":P"  : 'icon_razz.gif'
    };

    var patterns = [];
    for (smile in emt) {
        patterns.push([
            // escaping string special characters by hand
            // case-insensitive to match :p :d etc.
            new RegExp(smile.replace(/([\(\)\[\]\{\}\.\?\^\$\|\-])/g, "\\$1"), "gi"),
            '<img src="' + url + emt[smile] + '" class="emoticons" />'
        ]); 
    }

    // this is the function that will be referenced by the variable emoticons
    return function (text) {
        for(var i=0; i<patterns.length; i++) {
            text = text.replace(patterns[i][0], patterns[i][1]);
        }
        return text;
    }

})();

以下是演示:http://jsfiddle.net/gjfzf/2/