我使用javascript和正则表达式创建了一个搜索功能,就像使用自动完成功能的facebooks搜索字段一样。 这样可以正常工作,但是当我搜索丹麦字母Æ,Ø,Å时,.test()函数将无法正确识别它并且不返回任何内容。
这基本上是搜索部分的工作方式:
var regXSearch = "\\b"+sTerm;
//sTerm is the value of my search field
var regX = new RegExp(regXSearch,"gi");
var nameCheck = regX.test(users[i]["User"]["name"]);
想象一下用户名asbjørn,østergård和jason:
我找到了一个实际上可以用æøå搜索的小提琴,但它只在搜索整个单词时才有效。我不能解释它是如何工作的,但也许你可以使用它来找到我的问题的可能修复:http://jsfiddle.net/8Y3cM/17/
这是可修复的还是我需要切换到某种插件搜索功能?
答案 0 :(得分:2)
你的问题是双重的。
首先: \b
匹配其位置上的分词。单词中断匹配时,在其中一侧有单词字符,而在另一侧有非单词字符。您的正则表达式以"\\b"+sTerm
开头,因此jason
和\bason
上的\bson
会失败,但会匹配\bj
,\bjas
和{ {1}}。如果没有什么'在\bjaso
的左侧,它会被视为'而不是单词字符' (没有单词字符,请参阅?:),在失败的情况下,是那里的东西,而在Match情况下没有。
第二次:字符\b
和ø
不被认为"字符"在Javascript中,这个简单的测试会告诉你:
å
由于它们不被视为单词字符,alert ("østergård".match(/\W+/g));
的行为与您认为的行为相反:
\b
失败是因为alert ("østergård".match(/\bøster/)); // null
在其右侧看到了一个无字字符(\b
),所以它应该匹配左边的字符(它没有,没有什么有)。
针对您的样本案例的小型测试套件:
ø
显示与您报告的var sTerm = [
[ "asbjørn", "asbjør", "asb", "ørn" ],
[ "østergård", "øster", "østergård" ],
[ "østergård", "stergård", "ård", "rd" ],
[ "jason", "j", "jas", "jaso" ],
[ "jason", "ason", "son" ]
];
var r = '';
for (s=0; s<sTerm.length; s++)
{
for (s2=1; s2<sTerm[s].length; s2++)
{
var regXSearch = "\\b"+sTerm[s][s2];
//sTerm is the value of my search field
var regX = new RegExp(regXSearch,"gi");
var nameCheck = regX.test(sTerm[s][0]);
r += "["+sTerm[s][s2]+"] on ["+sTerm[s][0]+"] is "+nameCheck+'\r';
}
}
alert (r);
和true
相同的顺序。如果您移除false
中的\b
,则会看到所有返回regXSearch
。
您使用有效的单词字符替换非单词字符(没有任何个人信息,这只是根据Javascript!),因此您可以获得true
的预期行为。
更好的解决方法是不要依赖\b
的这种特定行为(以及\b
)。如果这些用户名可能出现在任何文本的任何位置(因此不仅仅是在字符串的开头),您可以使用以下内容:
\w
RegEx
var regXSearch = "(^|[^\\wøå])"+sTerm;
代表
(^|[^\\wøå])
字符串的开头^
或|
NOT([^...]
)任意字符^
,\w
,ø
答案 1 :(得分:0)
我能够通过让两个不同的变量包含同一组用户来进行临时修复 - 一个包含æøå的真实姓名,另一个包含替换值。 (用于查看搜索功能)
如果有人遇到类似的问题,替换字符的功能如下:
var mapObj = { æ:"ae", ø:"oe", å:"aa", Æ:"AE", Ø:"OE", Å:"AA" };
sTerm = sTerm.replace(/æ|ø|å|Æ|Ø|Å/gi, function(matched){
return mapObj[matched];
});
如果有人有更好的解决方案,我仍然感兴趣。 :)