我有这个功能:
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()转换第一次出现,如何在文本中替换多个表情符号?如何更改此功能?
非常感谢!
答案 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;
}
})();