我正在创建一个自动完成,结果突出显示我遇到了一些问题。您看到我的搜索算法非常慷慨并忽略了结果中的撇号,因此像joes
这样的查询将匹配Joe's
。搜索算法得到了解决,现在成为突出部分。我想把匹配的图案加粗。
假设我有一个原始的无格式结果:Joe’s
(请注意rsquo \ u2019)我想突出显示如下:Joe’s
,对于以下内容查询joes
,joe's
和joe’s
(rsquo \ u2019)
我在查询中包含了右侧单引号,因为您不知道是否有人从word文档或其他内容复制查询。
我可以轻易地忽略引号在搜索/结果字符串中存在这一事实,但是当你不小心输入类似joes'
或更差的内容时,这会弄乱搜索的整个点。 {1}}。所以我不知何故需要保留报价位置。另请注意,撇号也可以在未格式化的结果字符串中的任何位置,如jo'es
。
以下是一系列方案:
Suq'Ata
Liliana's
,lilianas
liliana's
Liliana's
Suq'Ata
,suqat
suq'at
Suq'Ata
Telim'Tor's
,telimt
telim't
应该注意的是,查询中引号的位置很重要,而当您在查询中放错引号时,它根本不匹配。所以它要么你有正确的引用位置,要么根本没有引号来突出显示原始字符串。
我实际上不介意提议的解决方案是否要拆分每个字母并循环遍历它(已经考虑过),因为我将在给定时间执行此操作最多5个字符串。我期待着你的建议!
答案 0 :(得分:1)
更新了提问者的问题规范:
我可以想到更好的算法,但是从这里开始是一个快速而又脏的第一次尝试,使用每个字母方法的天真循环:
var quotesRegex = /['\u2019]/g;
function highlightMatch(origStr, query) {
query = query.toLowerCase();
var j = 0;
for (var i = 0; i < query.length; ++i, ++j) {
// Query has a quote; it needs to be in the same position as origStr
if (query.charAt(i).match(quotesRegex)) {
if (!origStr.charAt(j).match(quotesRegex)) {
return origStr; // quote position mismatch
}
continue;
}
while (origStr.charAt(j).match(quotesRegex)) {
j++;
}
if (origStr.charAt(j).toLowerCase() != query.charAt(i)) {
return origStr;
}
}
return "<b>" + origStr.slice(0, j) + "</b>" + origStr.slice(j);
}
JSFiddle:http://jsfiddle.net/FFt2T/6/