нечувствительное к ударению регулярное выражение


Мой код:

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>';
  }));
 }

});

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

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

Следует выделить: [ção] или [çÃo] или [cáo] или expre[cão]tion или [Cáo] tion

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

2 8

2 ответа:

Единственный правильный способ сделать это-сначала запустить его черезUnicode Normalization Form D , canonical decomposition.

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

Ни при каких обстоятельствах не Закодируйте связку литералов. ИК!

Боа сорт!

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

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.