Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用javascript替换字符串?_Javascript - Fatal编程技术网

如何用javascript替换字符串?

如何用javascript替换字符串?,javascript,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.g

我有这个功能:

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);
}
功能图释(文本){
变量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\u e\u su.gif”,
“:?”:“icon_e_fuzzle.gif”,
“8-”:“icon_cool.gif”,
“:x”:“icon\u mad.gif”,
“:P”:“icon_razz.gif”
};
对于(emt中的微笑){
text=text.replace(微笑“”);
}
返回(文本);
}
如您所知.replace()转换第一次出现时,如何替换文本中的多个表情符号?如何更改此函数


非常感谢!

您可以将每个表情符号字符串转换为全局正则表达式,当与字符串#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',
//...

你必须小心在表情符号文本中逃出特殊的字符。

对你现有的函数来说是一个相当小的改变,这是应该的。如果你做这些替换的文本很大,你可以考虑在头上翻转,使用正则表达式替换和替换函数。p> 正则表达式替换如下:

/A | B | C/
,它告诉正则表达式引擎看起来像ABC。您给
String#replace
的函数接收匹配文本作为参数,这样它就可以在映射中查找相关替换:

function emoticons(text){
    // The base URL of all our smilies
    var url = "http://www.domain.it/images/smilies/";

    // A regex alternation that looks for all of them (be careful to use escapes
    // where necessary)
    var searchFor = /:D|:-D|:\)|:-\)|;\)|';-\)|:\(|:-\(|:o|:\?|8-\)|:x|:P/gi;

    // A map mapping each smiley to its image
    var map = {
        ":D"  : 'icon_e_biggrin.gif', // Capped version of the next
        ":d"  : 'icon_e_biggrin.gif', // Lower case version of the previous
        ":-D" : 'icon_e_biggrin.gif', // Capped version of the next
        ":-d" : 'icon_e_biggrin.gif', // Lower case version of the previous
        ":)"  : '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', // Capped version of the next
        ":o"  : 'icon_e_surprised.gif', // Lower case version of the previous
        ":?"  : 'icon_e_confused.gif',
        "8-)" : 'icon_cool.gif',

        ":X"  : 'icon_mad.gif',    // Capped version of the next
        ":x"  : 'icon_mad.gif',    // Lower case version of the previous
        ":P"  : 'icon_razz.gif',   // Capped version of the next
        ":p"  : 'icon_razz.gif'    // Lower case version of the previous
    };

    // Do the replacements
    text = text.replace(searchFor, function(match) {
        var rep;

        // Look up this match to see if we have an image for it
        rep = map[match];

        // If we do, return an `img` tag using that smiley icon; if not, there's
        // a mis-match between our `searchFor` regex and our map of
        // smilies, but handle it gracefully by returning the match unchanged.
        return rep ? '<img src="' + url + rep + '" class="emoticons" />' : match;
    });

    return (text);
}
功能图释(文本){
//我们所有笑脸的基本URL
变量url=”http://www.domain.it/images/smilies/";
//一个正则表达式替换,用于查找所有的正则表达式(注意使用转义)
//(如有需要)
var searchFor=/:D::-D:\):-\)-\)-\)-\:\(;:-\):\(;:o:\?:8-\):x::P/gi;
//将每个笑脸映射到其图像的贴图
变量映射={
“:D”:‘icon_e_biggrin.gif’,//下一个
“:d”:‘icon_e_biggrin.gif’,//以前版本的小写版本
“:-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\u e\u sugged.gif',//下一个
“:o”:‘icon_e_seu sugged.gif’,//以前版本的小写版本
“:?”:“icon_e_fuzzle.gif”,
“8-”:“icon_cool.gif”,
“:X”:‘icon_mad.gif’,//下一个
“:x”:‘icon_mad.gif’,//以前版本的小写版本
“:P”:‘icon_razz.gif’,//下一个
“:p”:‘icon_razz.gif’//以前版本的小写版本
};
//做替换
text=text.replace(搜索,函数(匹配){
var代表;
//查找此匹配以查看是否有它的图像
rep=映射[匹配];
//如果我们这样做了,就用那个笑脸图标返回一个'img'标记;如果没有,就没有了
//我们的'searchFor'正则表达式和我们的
//微笑,但要优雅地处理它,请原封不动地返回匹配项。
返回代表?'':匹配;
});
返回(文本);
}
这样做只允许在字符串中循环一次并生成一个替换字符串,而不是为每个笑脸循环一次并生成多个临时字符串


对于少量的文本来说,这无关紧要,其复杂性(将每个笑脸保持在两个不同的位置)可能不值得,但对于大型文本来说,这可能是值得的。

另一个解决方案是创建一个带有“g”的RegExp每一个字符串的修饰符,因为这个函数可以运行一次以上的PAR页面,你应该创建<代码> EMT 和ReXEXP只有一次:

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;
    }

})();
var emoticons=(函数(){
变量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\u e\u su.gif”,
“:?”:“icon_e_fuzzle.gif”,
“8-”:“icon_cool.gif”,
“:x”:“icon\u mad.gif”,
“:P”:“icon_razz.gif”
};
var模式=[];
对于(emt中的微笑){
推([
//手动转义字符串特殊字符
//不区分大小写以匹配:p:d等。
新的RegExp(smile.replace(/([\(\)\[\]\{\}.\?\^\$\\\\-])/g,“\\$1”),“gi”),
''
]); 
}
//这是变量表情将引用的函数
返回函数(文本){

对于(var i=0;i@Damiano:抱歉,我没有注意到您正在生成一个完整的标记。我已对此进行了更新。您只需将从函数返回的字符串的内容更改为替换项。@Damiano:
/gi
将使正则表达式不区分大小写,但不区分映射。对象属性始终区分大小写。您只需放置两个地图上重要的条目只有五个,我已经更新了答案。