用它们的图像替换表情符号列表

IT技术 javascript emoticons
2021-02-26 07:51:10

我有一个数组:

emoticons = {
   ':-)' : 'smile1.gif',
   ':)'  : 'smile2.gif',
   ':D'  : 'smile3.gif'     
}

然后我有一个文本变量。

var text = 'this is a simple test :)';

和一个带有网站网址的变量

var url = "http://www.domain.com/";

如何编写一个用图像替换符号的函数?

<img>标签的结果应该是:

<img src="http://www.domain.com/simple2.gif" />

(我必须将 url 变量连接到图像的名称)。

非常感谢!

3个回答

另一种方法:

function replaceEmoticons(text) {
  var emoticons = {
    ':-)' : 'smile1.gif',
    ':)'  : 'smile2.gif',
    ':D'  : 'smile3.gif'
  }, url = "http://www.domain.com/";
  // a simple regex to match the characters used in the emoticons
  return text.replace(/[:\-)D]+/g, function (match) {
    return typeof emoticons[match] != 'undefined' ?
           '<img src="'+url+emoticons[match]+'"/>' :
           match;
  });
}

replaceEmoticons('this is a simple test :)');
// "this is a simple test <img src="http://www.domain.com/smile2.gif"/>"

编辑: @pepkin88提出了一个非常好的建议,根据emoticons对象的属性名称构建正则表达式

这很容易完成,但如果我们希望它正常工作,我们必须转义元字符。

转义的模式存储在一个数组中,稍后用于使用RegExp构造函数构建正则表达式,方法是基本上连接所有用|元字符分隔的模式

function replaceEmoticons(text) {
  var emoticons = {
    ':-)' : 'smile1.gif',
    ':)'  : 'smile2.gif',
    ':D'  : 'smile3.gif',
    ':-|'  : 'smile4.gif'
  }, url = "http://www.domain.com/", patterns = [],
     metachars = /[[\]{}()*+?.\\|^$\-,&#\s]/g;

  // build a regex pattern for each defined property
  for (var i in emoticons) {
    if (emoticons.hasOwnProperty(i)){ // escape metacharacters
      patterns.push('('+i.replace(metachars, "\\$&")+')');
    }
  }

  // build the regular expression and replace
  return text.replace(new RegExp(patterns.join('|'),'g'), function (match) {
    return typeof emoticons[match] != 'undefined' ?
           '<img src="'+url+emoticons[match]+'"/>' :
           match;
  });
}

replaceEmoticons('this is a simple test :-) :-| :D :)');
@pepkin88:很好的建议:),我添加了一个功能,使这成为可能。
2021-04-19 07:51:10
如果根据 中的键值生成正则表达式会更好emoticons
2021-04-23 07:51:10
@redV 我很高兴它对你有帮助!
2021-04-23 07:51:10
这可以通过关闭replace()(类似于这个答案......)来进一步增强- 这将加速对该函数的重复调用。
2021-05-08 07:51:10
@CMS 这对我的一个应用程序有很大帮助。
2021-05-15 07:51:10
for ( smile in emoticons )
{
   text = text.replace(smile, '<img src="' + url + emoticons[smile] + '" />');
}
将多次发生的更改替换smilenew RegExp(smile, 'g')
2021-04-30 07:51:10
还要确保varfor...in语句中使用,否则如果代码位于未smile在该范围内声明变量的函数内部,它将成为全局变量,并且if (emoticons.hasOwnProperty(smile))在循环内部使用a 是个好主意。
2021-05-02 07:51:10
它不会正常工作,因为替换只替换匹配字符串的第一次出现。
2021-05-07 07:51:10
仅适用于替换每个笑脸的第一次出现。在像“This is changed :) but not this :)”这样的字符串中,第二个保持不变。
2021-05-13 07:51:10
好的,那么如何使用 .replace() 来替换不止一次出现?
2021-05-13 07:51:10

使用带有查找替换元素数组的正则表达式效果很好。

var emotes = [
    [':\\\)', 'happy.png'],
    [':\\\(', 'sad.png']
];

function applyEmotesFormat(body){
    for(var i = 0; i < emotes.length; i++){
        body = body.replace(new RegExp(emotes[i][0], 'gi'), '<img src="emotes/' + emotes[i][1] + '">');
    }
    return body;
}