2017-05-03 102 views
2

我正在寻找一种使用正则表达式匹配使用Javascript的重音和非重音版本的字符串的方式。Javascript正则表达式匹配重音和非重音版本的字符串

我延长jQuery的UI的自动完成功能在自动完成周围添加粗体字的HTML标签,这里是我的代码:

<script> 
// Add feature to autocomplete to make the searched query in bold letter 
    $.extend($.ui.autocomplete.prototype, { 
     _renderItem: function (ul, item) { 
      var searchMask = this.element.val(); 
      var replaceMask = "<b style=\"\">$&</b>"; 
      var splittedMask = searchMask.split(' '); 
      var html = regEx = ''; 
      // Fix I added so it works with multiple words. 
      splittedMask.forEach(function(word){ 
       if (word.length >= 2){ 
        // Here is the part that should interest you 
        regEx = new RegExp(word, "ig"); 
        if (html == ''){ 
         html = item.label.replace(regEx, replaceMask); 
        } else { 
         html = html.replace(regEx, replaceMask); 
        } 
       } else { 
        html = item.label; 
       } 
      }); 

      return $("<li></li>") 
       .data("item.autocomplete", item) 
       .append($("<span></span>").html(html)) 
       .appendTo(ul); 
     } 
    }); 
</script> 

所以现在,如果我写的(例如)蒙特利尔,它的工作原理和在我的菜单中找到蒙特利尔,但如果我写蒙特利尔,它不会被RegEx发现。

我在网上找过,但找不到正确的RegEx。

+1

您将需要首先对输入进行归一化处理,因为没有办法将'é'与'e'匹配。尽管如此,你可以考虑用'[eé]'替换所有'e'。 –

+0

@WiktorStribiżew它实际上是一个好主意的人,我用e去[eé]和a去做[aà]。你应该做一个答案,我相信这是一个很好的解决我的问题 –

+0

我添加了这个建议的答案。 –

回答

1

你可能会考虑normalizing the input first因为有没有办法匹配ée与正则表达式。

或者,您可以考虑在您的模式中替换所有e[eé](如果您只使用字面字符串构建模式,将是安全的)。您可以使用关联数组,其中键用于搜索包含字符类的字母和值以匹配所有重音变体。

2

这不是直接的 - 基本上唯一的方法就是在将它们传递到RegEx之前用非重音版本替换重音字符。

这篇文章有一些示例代码(寻找“嗨,哥们,我只是这里的复制/粘贴的”一节),再加上很多需要注意的地方:Accent Folding for Auto-Complete

+0

我很伤心地看到,它删除口音,然后尝试搜索,但后来我的蒙特利尔不会被发现,只有蒙特利尔将被发现 –