重音不敏感的正则表达式

时间:2010-11-23 22:40:23

标签: jquery regex unicode highlight diacritics

我的代码:

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] OR [çÃo] OR [cáo] OR expre [cão] tion或[Cáo] tion

我该怎么做?

2 个答案:

答案 0 :(得分:5)

执行此操作的唯一正确方法是首先通过 Unicode规范化表单D 运行,规范分解。

然后删除我们产生的任何标记(\pM字符,或者\p{Diacritic},取决于),然后针对de / un-marked版本运行匹配。

在任何情况下都不要硬编码一堆文字。 EEK!

Boa sorte!

答案 1 :(得分:3)

您需要提供一个替代字符表,并根据该表动态生成正则表达式。例如:

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