Я пытаюсь записать "поле поиска предложения", и я не могу найти решение, которое позволяет выделять подстроку с JavaScript, сохраняющим исходный случай.
Например, если я ищу"ca
"Я ищу сторону сервера в нечувствительном к регистру режиме, и у меня есть следующие результаты:
Калькулятор
календарь
ESCAPE
Я хотел бы просмотреть строку поиска во всех предыдущих словах, таким образом, результат должен быть:
Калькулятор
календарь
ESCAPE
Я попробовал следующим кодом:
var reg = new RegExp(querystr, 'gi');
var final_str = 'foo ' + result.replace(reg, '<b>'+querystr+'</b>');
$('#'+id).html(final_str);
Но очевидно таким образом я освобождаю исходный случай!
Существует ли способ решить эту проблему?
Используйте функцию для второго аргумента для .replace()
, которая возвращает фактическую сопоставимую строку со сцепленными тегами.
Попробуйте: http://jsfiddle.net/4sGLL/
reg = new RegExp(querystr, 'gi');
// The str parameter references the matched string
// --------------------------------------v
final_str = 'foo ' + result.replace(reg, function(str) {return '<b>'+str+'</b>'});
$('#' + id).html(final_str);
Пример JSFiddle с вводом: https://jsfiddle.net/pawmbude/
Я делаю то же самое.
Вам нужно сделать копию.
Я сохраняю в базе данных копию реальной строки в нижнем регистре.
Затем я выполняю поиск, используя строчную версию строки запроса или выполняю регулярное выражение без учета регистра.
Затем используйте полученный найденный начальный индекс в основной строке плюс длину строки запроса, чтобы выделить строку запроса в результате.
Вы не можете использовать строку запроса в результате, поскольку ее регистр не определен. Вам нужно выделить часть исходной строки .
.match()
выполняет поиск без учета регистра и возвращает массив совпадений с сохранением регистра.
var matches = str.match(queryString),
startHere = 0,
nextMatch,
resultStr ='',
qLength = queryString.length;
for (var match in matches) {
nextMatch = str.substr(startHere).indexOf(match);
resultStr = resultStr + str.substr(startHere, nextMatch) + '<b>' + match + '</b>';
startHere = nextMatch + qLength;
}