首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JavaScript执行带/不带重音字符的文本匹配

使用JavaScript执行带/不带重音字符的文本匹配
EN

Stack Overflow用户
提问于 2011-04-18 17:02:58
回答 6查看 52.3K关注 0票数 48

我使用基于AJAX的查找方法查找用户在文本框中搜索的名称。

我假设数据库中的所有姓名都将音译为欧洲字母(即没有西里尔字母、日语和中文)。但是,名称仍将包含重音字符,例如ç、……,甚至č和ć。

然而,像"Micic“这样的简单搜索不会匹配"Mičić”--用户期望它会匹配。

AJAX查找使用正则表达式来确定匹配。我已经使用此函数修改了正则表达式比较,以尝试匹配更多重音字符。然而,它有点笨拙,因为它没有考虑到所有的字符。

代码语言:javascript
复制
function makeComp (input)
{
    input = input.toLowerCase ();
    var output = '';
    for (var i = 0; i < input.length; i ++)
    {
        if (input.charAt (i) == 'a')
            output = output + '[aàáâãäåæ]'
        else if (input.charAt (i) == 'c')
            output = output + '[cç]';
        else if (input.charAt (i) == 'e')
            output = output + '[eèéêëæ]';
        else if (input.charAt (i) == 'i')
            output = output + '[iìíîï]';
        else if (input.charAt (i) == 'n')
            output = output + '[nñ]';
        else if (input.charAt (i) == 'o')
            output = output + '[oòóôõöø]';
        else if (input.charAt (i) == 's')
            output = output + '[sß]';
        else if (input.charAt (i) == 'u')
            output = output + '[uùúûü]';
        else if (input.charAt (i) == 'y')
            output = output + '[yÿ]'
        else
            output = output + input.charAt (i);
    }
    return output;
}

除了这样的替代函数之外,还有更好的方法吗?也许是为了“强调”被比较的字符串?

EN

回答 6

Stack Overflow用户

发布于 2013-04-09 02:23:26

偶然发现了这个老线程,我想我应该试着做一个快速函数。当设置变量与replace()调用的函数匹配时,我依赖于以管道分隔的on设置变量的顺序。我的目标是尽可能多地使用标准的regex实现javascript的replace()函数,以便繁重的处理可以在低级浏览器优化的空间中进行,而不是在昂贵的javascript逐个字符比较中进行。

这根本不科学,但当我将这个线程中的其他功能插入到我的自动完成中时,我的旧华为IDEOS android手机速度很慢,而这个功能正在压缩:

代码语言:javascript
复制
function accentFold(inStr) {
  return inStr.replace(
    /([àáâãäå])|([çčć])|([èéêë])|([ìíîï])|([ñ])|([òóôõöø])|([ß])|([ùúûü])|([ÿ])|([æ])/g, 
    function (str, a, c, e, i, n, o, s, u, y, ae) {
      if (a) return 'a';
      if (c) return 'c';
      if (e) return 'e';
      if (i) return 'i';
      if (n) return 'n';
      if (o) return 'o';
      if (s) return 's';
      if (u) return 'u';
      if (y) return 'y';
      if (ae) return 'ae';
    }
  );
}

如果您是jQuery开发人员,这里有一个使用此函数的简单示例;您可以像在选择器中使用:contains一样使用:图标:

代码语言:javascript
复制
jQuery.expr[':'].icontains = function (obj, index, meta, stack) {
  return accentFold(
    (obj.textContent || obj.innerText || jQuery(obj).text() || '').toLowerCase()
  )
    .indexOf(accentFold(meta[3].toLowerCase())
  ) >= 0;
};
票数 16
EN

Stack Overflow用户

发布于 2011-04-18 17:11:48

据我所知,没有比这更容易的“去重音”的方法了,但是你的替换可以简化一点:

代码语言:javascript
复制
var makeComp = (function(){

    var accents = {
            a: 'àáâãäåæ',
            c: 'ç',
            e: 'èéêëæ',
            i: 'ìíîï',
            n: 'ñ',
            o: 'òóôõöø',
            s: 'ß',
            u: 'ùúûü',
            y: 'ÿ'
        },
        chars = /[aceinosuy]/g;

    return function makeComp(input) {
        return input.replace(chars, function(c){
            return '[' + c + accents[c] + ']';
        });
    };

}());
票数 6
EN

Stack Overflow用户

发布于 2018-10-16 06:40:28

我认为这是最好的解决方案。

代码语言:javascript
复制
var nIC = new Intl.Collator(undefined , {sensitivity: 'base'})
var cmp = nIC.compare.bind(nIC)

如果两个字符串相同,它将返回0,忽略重音。

或者,您可以尝试localecompare

代码语言:javascript
复制
'être'.localeCompare('etre',undefined,{sensitivity: 'base'})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5700636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档