2012-05-29 2 views
4

я функция, которая заменяет текстовые смайлики и т.д. смайлики изображениясделать замену функция регистронезависимого

Как я могу сделать этот случай нечувствительным? Я попытался с помощью "ги" и "ИГ" в заменителе, но does'nt, кажется, чтобы сделать разницу

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; 
}; 
+0

«i» работает только в firefox, так как я вижу его – mowgli

ответ

2

Изменение:

out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g'); 

To:

out = out.replace(new RegExp(k.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 'ig'), '<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />'); 

Функция возврата эвакуатора из этого ответа Escape string for use in Javascript regex

+0

Это внутри для (k в emots) {)? – mowgli

+0

@mowgli Да, это так. Он просто берет флаги из вашей функции replace и преобразует их в флаги для регулярного выражения. 'escapeRegExp' экранирует все специальные символы регулярных выражений, хотя вам действительно нужно просто сбежать из' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' на. – Paulpro

+0

Хорошо;) Но Im думает ... is'nt неправильно создавать функцию внутри цикла? Он будет создан (или проверен и не воссоздан, я не знаю) для каждой буквы, я думаю – mowgli

1

Это немного сложнее, чем Пырсы на поверхности. Следующее - полное решение. Для простоты и эффективности он использует только один поиск регулярных выражений в целевой строке.

Обратите внимание, что, потому что это чувствительно к регистру (например, (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; 
    }); 
} 
+0

Ничего себе много кода .. Не пробовал. Другой более короткий ответ был совершенным. И просто хорошо;) – mowgli

+0

Так и должно быть. Однако, как вы знаете, другой ответ, который вы имеете в виду, требует отдельного поиска и замены для каждого свойства emots, что значительно менее эффективно и будет замедляться по мере добавления дополнительных смайликов для поиска. Он также использует ненужное многозначное регулярное выражение для экранирования метасимволов регулярных выражений. – slevithan

-2

Или просто используйте .toLowerCase() на входе перед запуском проверки?

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