нечувствительный к акценту регулярное выражение - PullRequest
8 голосов
/ 24 ноября 2010

Мой код:

jQuery.fn.extend({
 highlight: function(search){
  var regex = new RegExp('(<[^>]*>)|('+ search.replace(/[.+]i/,"$0") +')','ig');

  return this.html(this.html().replace(regex, function(a, b, c){
   return (a.charAt(0) == '<') ? a : '<strong class="highlight">' + c + '</strong>';
  }));
 }

});

Я хочу выделить буквы с акцентом, например:

$('body').highlight("cao");

должен выделить: [ção] ИЛИ [çÃo] ИЛИ [cáo] ИЛИ expre[cão] ion ИЛИ [Cáo] ion

Как я могу это сделать?

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

Единственный правильный способ сделать это - сначала запустить его через Форма нормализации Unicode D , каноническая декомпозиция.

Затем вы удаляете все наши метки (\pM символов или, возможно, \p{Diacritic}, в зависимости от) и запускаете матч с де / неотмеченной версией.

Непри любых обстоятельствах жестко закодируйте кучу литералов.Eek!

Боа сорте!

3 голосов
/ 24 ноября 2010

Вам необходимо составить таблицу альтернативных символов и динамически сгенерировать регулярное выражение на основе этого. Например:

var alt = {
  'c': '[cCç]',
  'a': '[aAãÃá]',
  /* etc. */
};

highlight: function (search) {
  var pattern = '';
  for (var i = 0; i < search.length; i++) {
    var ch = search[i];
    if (alt.hasOwnProperty(ch))
      pattern += alt[ch];
    else
      pattern += ch;
  }

  ...
}

Тогда для search = 'cao' будет создан шаблон [cCç][aAãÃá]o.

...