Сделать функцию замены нечувствительной к регистру символов
У меня есть функция, которая заменяет текстовые смайлики и т. д. с изображением смайликов
Как я могу сделать этот случай нечувствительным?
Я пробовал использовать "gi" и "ig" в заменителе, но это, кажется, не имеет значения
var emots = {
':)' : 'smile',
':-)' : 'smile',
';)' : 'wink',
';-)' : 'wink',
':(' : 'downer',
':-(' : 'downer',
':D' : 'happy',
':-D' : 'happy',
'(smoke)' : 'smoke',
'(y)' : 'thumbsup',
'(b)' : 'beer',
'(c)' : 'coffee',
'(cool)' : 'cool',
'(hehe)' : 'tooth',
'(haha)' : 'tooth',
'(lol)' : 'tooth',
'(pacman)' : 'pacman',
'(hmm)' : 'sarcastic',
'(woot)' : 'woot',
'(pirate)' : 'pirate',
'(wtf)' : 'wtf'
};
function smile(str){
var out = str;
for(k in emots){
out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g');
}
return out;
};
3 ответов:
Изменение:
out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g');Кому:
out = out.replace(new RegExp(k.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 'ig'), '<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />');Функция экранирования Regex, взятая из этого ответа Escape-строка для использования в JavaScript regex
Это немного сложнее, чем кажется на первый взгляд. Следующее-Это полное решение. Он использует только один поиск регулярных выражений в целевой строке для простоты и эффективности.
Обратите внимание, что, поскольку он нечувствителен к регистру (например,(hehe)и(HeHe)обрабатываются одинаково),:-dтакже обрабатывается так же, как:-D.var emots = { ':)' : 'smile', ':-)' : 'smile' // Add the rest of your emoticons... }; // Build the regex that will be used for searches var emotSearch = []; for (var p in emots) { if (emots.hasOwnProperty(p)) { emotSearch.push(p.replace(/[-[{()*+?.\\^$|]/g, '\\$&')); if (p !== p.toLowerCase()) { emots[p.toLowerCase()] = emots[p]; } } } emotSearch = RegExp(emotSearch.join('|'), 'gi'); function smile(str) { return str.replace(emotSearch, function ($0) { var emot = $0.toLowerCase(); if (emot in emots) { return '<img src="/emoticons/' + emots[emot] + '.gif" title="' + $0 + '" />'; } return $0; }); }
Comments