【问题标题】:accent insensitive regex口音不敏感的正则表达式
【发布时间】:2011-05-14 18:54:42
【问题描述】:

我的代码:

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 OR [Cáo]tion

我该怎么做?

【问题讨论】:

    标签: jquery regex unicode highlight diacritics


    【解决方案1】:

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

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

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

    Boa sorte!

    【讨论】:

    • 我该怎么做?这是一半的答案,只是指向解决方案!
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2014-05-08
      • 2011-12-19
      • 2015-11-11
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多