我正在创建一个自动完成功能,但我在突出显示结果时遇到了一点问题。您会看到我的搜索算法非常慷慨并且忽略了结果中的撇号,因此像 joes
这样的查询将匹配 Joe's
.搜索算法已经处理完毕,现在是突出显示部分。我想让匹配的图案加粗。
假设我有一个原始的未格式化结果:Joe’s
(请注意 rsquo\u2019) 我想这样强调它:<strong>Joe’s</strong>
, 对于以下查询 joes
, joe's
, 和 joe’s
(rsquo\u2019)
我在查询中包含了右侧单引号,因为您不知道是否有人从 word 文档或其他内容中复制了查询。
我可以通过忽略引号在搜索/结果字符串中的事实来轻松做到这一点,但是当您不小心输入类似 joes'
的内容时,这会弄乱整个搜索点。甚至更糟jo'es
.所以我不知何故需要保留报价位置。另请注意,撇号也可以出现在未格式化的结果字符串中的任何位置,例如 Suq'Ata
。 .
以下是场景列表:
- 字符串:
Liliana's
- 查询:
lilianas
,liliana's
- 结果:
<strong>Liliana's</strong>
- 字符串:
Suq'Ata
- 查询:
suqat
,suq'at
- 结果:
<strong>Suq'At</strong>a
- 字符串:
Telim'Tor's
- 查询:
telimt
,telim't
- 结果:
<strong>Telim'T</strong>or's
应该注意的是,查询中引号的位置很重要,而当您在查询中放错引号时,它根本不应该匹配。所以要么你有正确的引号位置,要么根本没有引号来突出显示原始字符串。
我实际上不介意建议的解决方案是否是拆分每个字母并循环遍历它(考虑过),因为我只会在给定时间对最多 5 个字符串执行此操作。我期待着您的建议!
最佳答案
来自提问者的更新问题规范:
- 如果用户的查询有引号,它的位置必须与原始字符串的引号匹配。例如。查询“jo'es”与原始字符串“Joe's”不匹配。
- 我们只需要将查询的开头与原始字符串的开头进行匹配即可。
我可以想出更好的算法,但要从这里开始,首先要进行快速而肮脏的尝试,对每个字母方法使用朴素循环:
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/
关于javascript - JS正则表达式名称突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8255679/