Javascript regex replace text with emoticons

后端 未结 3 1306
忘了有多久
忘了有多久 2021-01-07 11:40

I need to replace text like ;) or :p by emoticon but I can\'t create a regex in order to detect this. Now i can detect only like :wink:

相关标签:
3条回答
  • 2021-01-07 12:17

    I modified AK1's answer and provided an example.

    // Official Twitch robot emotes: https://twitchemotes.com
    var emoticons = {
      ':)'   : 'ebf60cd72f7aa600',
      ':('   : 'd570c4b3b8d8fc4d',
      ':o'   : 'ae4e17f5b9624e2f',
      ':z'   : 'b9cbb6884788aa62',
      'B)'   : '2cde79cfe74c6169',
      ':\\'  : '374120835234cb29',
      ';)'   : '3407bf911ad2fd4a',
      ';p'   : '3407bf911ad2fd4a',
      ':p'   : 'e838e5e34d9f240c',
      'R)'   : '0536d670860bf733',
      'o_O'  : '8e128fa8dc1de29c',
      ':D'   : '9f2ac5d4b53913d7',
      '>('   : 'd31223e81104544a',
      '<3'   : '577ade91d46d7edc'
    }
    // Convert the emoticon map entries into their fully-qualified paths.
    mapIdsToPaths(emoticons,
                  'https://static-cdn.jtvnw.net/jtv_user_pictures/',
                  'chansub-global-emoticon-',
                  '24x18');
    
    // Replace all possible emotes in each paragraph.
    document.querySelectorAll('p').forEach(e => e.innerHTML = replaceEmoticons(e.innerHTML, emoticons));
    
    function replaceEmoticons(text, emotes) {
       return Object.keys(emotes).reduce((result, emote) => {
          return result.replace(new RegExp(RegExpEscape(emote), 'gi'), function(match) {
            return (img => img != null ? '<img src="' + img + '"/>' : match)(emotes[match]);
          });
        }, text);
    }
    
    // helper function to escape special characters in regex
    function RegExpEscape(text) {
      return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    }
    
    // Map emote ids to their URLs.
    function mapIdsToPaths(emotes, url, prefix, size) {
      Object.keys(emotes).forEach((id) => {
        emotes[id] = url + prefix + emotes[id] + '-' + size + '.png';
      });
    }
    <p>Hello ;)<p>
    <p>How are you :)?<p>
    <p>o_O Today was not a good day... :(<p>

    0 讨论(0)
  • 2021-01-07 12:24

    Try the following.However, you should escape the special characters ( and ) in your smileys when making the regexes.

    //helper function to escape special characters in regex

    function RegExpEscape(text) {
        return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
    }
    
    function replaceEmoticons(text) {   
        var emoticons = {
            ':)'         : 'smile.gif',
            ':('         : 'sad.gif',
            ';)'         : 'wink.gif'
    
    
        }
    
        var result = text;
        var emotcode;
        var regex;
    
        for (emotcode in emoticons)
        {
            regex = new RegExp(RegExpEscape(emotcode), 'gi');
            result = result.replace(regex, function(match) {
                var pic = emots[match.toLowerCase()];
    
                if (pic != undefined) {
                    return '<img src="' + pic + '"/>';
                        } else {
                    return match;
                        }
                    });
        }
    
        return result;    
    }
    
    0 讨论(0)
  • 2021-01-07 12:30

    This function takes a string and returns a string with all the replacements found inside of the emots object.

    function replaceText(text) {
      var emots = {
        ";)": "wink",
        ":)": "xxx",
        ":p": "xxx", 
      };
    
      for(var key in emots){
        if(emots.hasOwnProperty(key)){
          text = text.replace(new RegExp(escapeRegExp(key), 'g'), '<img src="http://localhost:8080/' + emots[key] + '.png"/>');
        }
      }
      return text;
    }
    
    function escapeRegExp(str) {
      return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    }
    
    0 讨论(0)
提交回复
热议问题