2016-06-21 9 views
1

Мне нужно заменить текст как ;) или :p от emoticon, но я не могу создать регулярное выражение, чтобы обнаружить это. Теперь я могу обнаружить только как :wink:Javascript regex заменить текст смайликами

function replaceEmoticons(text) { 
    var emots = { 
    ";)": "wink", 
    ":)": "xxx", 
    ":p": "xxx", 

    }; 

    return text.replace(/:(.*?):/g, function (match) { 
    return typeof emots[match] != 'undefined' ? 
      '<img src="http://localhost:8080/'+emots[match]+'.png"/>' : 
      match; 
    }); 
} 

Что такое хороший регулярное выражение для этого?

+0

Почему вам нужно регулярное выражение в firstPlace? Просто сделайте 'yourString.replaceAll («: wink: », winkSource)' –

+0

Извините, я отредактировал свой пост. Мне нужно заменить весь пример массива ';)' by wink.png или ':)' by smile.png – Miky

+0

@ Bálint I «Скорее всего, нет« replaceAll »в прототипе String ... – ndugger

ответ

0

Эта функция принимает строку и возвращает строку со всеми заменами, найденными внутри объекта emots.

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, "\\$&"); 
} 
2

Попробуйте следующее. Однако при создании регулярных выражений вы должны избегать специальных символов (и) в ваших смайлах.

// вспомогательная функция, чтобы экранировать специальные символы в регулярных выражениях

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

Я изменил AK1's answer и привел пример.

// 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>

Смежные вопросы