为什么 typeahead 匹配句点?
Why is typeahead matching periods?
我正在使用 typeahead 示例中的相同代码 here。但是,如果您输入句点 .
,下拉菜单将显示匹配项。数组定义之上的所有这些代码都是必要的吗?有没有更简单的方法来完成同样的事情,如果你的数组中没有句点,你不会得到匹配的句点?
我看到下面的 bloodhound 示例完成了同样的事情并且不匹配句点但是它是否使用 var states
定义数组然后使用 var states
构建一个新的 bloodhound 引擎是这是一个错误?
从网站复制的代码:
var substringMatcher = function(strs) {
return function findMatches(q, cb) {
var matches, substringRegex;
// an array that will be populated with substring matches
matches = [];
// regex used to determine if a string contains the substring `q`
substrRegex = new RegExp(q, 'i');
// iterate through the pool of strings and for any string that
// contains the substring `q`, add it to the `matches` array
$.each(strs, function(i, str) {
if (substrRegex.test(str)) {
matches.push(str);
}
});
cb(matches);
};
};
var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii',
'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana',
'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota',
'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota',
'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island',
'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont',
'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'
];
$('#the-basics .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
name: 'states',
source: substringMatcher(states)
});
在我的例子中,我生成了一个标签数组,所以我使用的不是状态,而是 var tags = <%= raw Tag.all.pluck(:name) %>;
对于您的应用程序,您可能会发现 indexOf 比正则表达式更有用。
if (haystack.indexOf(needle) != -1) {
/* needle is in haystack */
}
或者,不区分大小写:
if (haystack.toLowerCase().indexOf(needle.toLowerCase()) != -1) {
}
像这样:
function findMatches(q, cb) {
var lq = q.toLowerCase();
var matches = [];
$.each(strs, function(i, str) {
if (str.toLowerCase().indexOf(lq) != -1) matches.push(str);
});
cb(matches);
}
所以正则表达式是"complicated",而且容易出错。 “。”例如在正则表达式中具有特殊含义,它匹配除 JS 中换行符之外的任何字符,因此例如基于 Mozilla 的文档 RexExp(".n", "i") 将匹配 ".n", "an", "in"、“?n”等等。
正则表达式很难正确。
@John-Hascall的建议很好地解决了这个问题。
我正在使用 typeahead 示例中的相同代码 here。但是,如果您输入句点 .
,下拉菜单将显示匹配项。数组定义之上的所有这些代码都是必要的吗?有没有更简单的方法来完成同样的事情,如果你的数组中没有句点,你不会得到匹配的句点?
我看到下面的 bloodhound 示例完成了同样的事情并且不匹配句点但是它是否使用 var states
定义数组然后使用 var states
构建一个新的 bloodhound 引擎是这是一个错误?
从网站复制的代码:
var substringMatcher = function(strs) {
return function findMatches(q, cb) {
var matches, substringRegex;
// an array that will be populated with substring matches
matches = [];
// regex used to determine if a string contains the substring `q`
substrRegex = new RegExp(q, 'i');
// iterate through the pool of strings and for any string that
// contains the substring `q`, add it to the `matches` array
$.each(strs, function(i, str) {
if (substrRegex.test(str)) {
matches.push(str);
}
});
cb(matches);
};
};
var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii',
'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana',
'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota',
'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota',
'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island',
'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont',
'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'
];
$('#the-basics .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
name: 'states',
source: substringMatcher(states)
});
在我的例子中,我生成了一个标签数组,所以我使用的不是状态,而是 var tags = <%= raw Tag.all.pluck(:name) %>;
对于您的应用程序,您可能会发现 indexOf 比正则表达式更有用。
if (haystack.indexOf(needle) != -1) {
/* needle is in haystack */
}
或者,不区分大小写:
if (haystack.toLowerCase().indexOf(needle.toLowerCase()) != -1) {
}
像这样:
function findMatches(q, cb) {
var lq = q.toLowerCase();
var matches = [];
$.each(strs, function(i, str) {
if (str.toLowerCase().indexOf(lq) != -1) matches.push(str);
});
cb(matches);
}
所以正则表达式是"complicated",而且容易出错。 “。”例如在正则表达式中具有特殊含义,它匹配除 JS 中换行符之外的任何字符,因此例如基于 Mozilla 的文档 RexExp(".n", "i") 将匹配 ".n", "an", "in"、“?n”等等。
正则表达式很难正确。
@John-Hascall的建议很好地解决了这个问题。