Replace a list of emoticons with their images

前端 未结 3 1053
挽巷
挽巷 2020-11-27 14:31

I have an array with:

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

then i hav

3条回答
  •  独厮守ぢ
    2020-11-27 15:14

    Another approach:

    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' ?
               '' :
               match;
      });
    }
    
    replaceEmoticons('this is a simple test :)');
    // "this is a simple test "
    

    Edit: @pepkin88 made a really good suggestion, build the regular expression based on the property names of the emoticons object.

    It can be easily done, but we have to escape meta-characters if we want this to work properly.

    The escaped patterns are stored on an array, that is later used to build the regular expression using the RegExp constructor, by basically joining all the patterns separated with the | metacharacter.

    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' ?
               '' :
               match;
      });
    }
    
    replaceEmoticons('this is a simple test :-) :-| :D :)');
    

提交回复
热议问题