accent insensitive regex

2019-01-26 09:11发布

问题:

My code:

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

});

I want to highlight letters with accents, ie:

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

should highlight: [ção] OR [çÃo] OR [cáo] OR expre[cão]tion OR [Cáo]tion

How can I do that?

回答1:

The sole correct way to do this is to first run it through Unicode Normalization Form D, canonical decomposition.

You then strip our any Marks that result (\pM characters, or perhaps \p{Diacritic}, depending), and run your match against the de/un-marked version.

Do not under any circumstances hardcode a bunch of literals. Eek!

Boa sorte!



回答2:

You need to come up with a table of alternative characters and dynamically generate a regex based on that. For example:

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

  ...
}

Then for search = 'cao' this will generate a pattern [cCç][aAãÃá]o.