我有一个函数,该函数接受string(特别是来自输入的地址或邮政编码),然后在匹配的结果周围添加强标签。它工作正常,但我希望它匹配无空格的字符。例如,如果输入字符串是cf142
,我希望它匹配CF14 2
。
下面是功能:
emboldenMatch(string, query) {
query = query.toLowerCase().trim();
if (string.toLowerCase().includes(query)) {
const queryLength = query.length;
const matchIndex = string.toLowerCase().indexOf(query);
const matchEnd = matchIndex + queryLength;
const before = string.substr(0, matchIndex);
const match = string.substr(matchIndex, queryLength);
const after = string.substr(matchEnd, string.length - matchEnd);
return `${before}<strong>${match}</strong>${after}`;
} else {
return string;
}
}
首先,您可以按如下方式编写现有功能:
function emboldenMatch(string, query) {
return string.replace(query, "<strong>$&</strong>")
}
console.log(em('some string with bold text', 'bold'));
如果要包装每个匹配项,而不仅是第一个匹配项,并且不敏感,可以将其设置为regexp
,并添加g
(=全局)标志和i
(=不敏感)标记:
function emboldenMatch(string, query) {
return string.replace(new RegExp(escapeRegExp(query), 'gi'), "<strong>$&</strong>")
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
console.log(emboldenMatch('some string with bold bold text', 'bold'));
现在,如果要在字符之间添加可选空格,可以按如下所示将其添加到正则表达式中:
function emboldenMatch(string, query) {
var reg = new RegExp(escapeRegExp(query).split('').join('\\s*'), 'gi');
return string.replace(reg, "<strong>$&</strong>")
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
console.log(emboldenMatch('some string with bo ld b old text', 'bold'));
尝试:
function emboldenMatch(string, query) {
query = query.toLowerCase().trim().replace(/ /g,'');
if (string.toLowerCase().includes(query)) {
const queryLength = query.length;
const matchIndex = string.toLowerCase().indexOf(query);
const matchEnd = matchIndex + queryLength;
const before = string.substr(0, matchIndex);
const match = string.substr(matchIndex, queryLength);
const after = string.substr(matchEnd, string.length - matchEnd);
return `${before}<strong>${match}</strong>${after}`;
} else {
return string;
}
}
console.log(emboldenMatch('asdf2', 'asdf 2'))
console.log(emboldenMatch('asdf2', 'asdf2'))