Либо символ OR
символ, за которым следует апостроф
split()
ключевое слово (например, obrien
) в массив символов:
var searchLetters = keyword.split('')
// ['o','b','r','i','e','n']
map()
каждый символ в строке регулярного выражения, который будет принимать либо ${
буквальное совпадение }
ИЛИ |
${
буквальное совпадение }
, за которым следует одна умная кавычка: [’
или одиночная прямая кавычка: ']
:
var regexStrings = searchLetters.map(function(character) {
return `(${character}|${character}['’])`;
});
// [`(${o}|${o}['’])`,`(${b}|${b}['’])`,`(${r}|${r}['’])`...]
Далее join()
новый массив строк регулярного выражения в одну строку регулярного выражения и использование его в объекте RegExp :
var singleRegex = regexStrings.join('');
var regexObject = new RegExp(`(${singleRegex})`, `gi`);
Этот объект RegExp будет использоваться для переноса любых совпадений с тегом <mark>
:
var hits = targetContent.innerHTML.replace(regexObject, `<mark>$1</mark>`);
Демо
document.getElementById('search').addEventListener('change', function(e) {
highlight(this.value, '#content');
});
function highlight(keyword, selector) {
var node = document.querySelector(selector);
var html = node.innerHTML;
var clean = html.replace(/(<mark>|<\/mark>)/, '');
var escaped = keyword.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&');
var letters = escaped.split('').map(function(letter) {
return `(${letter}|${letter}['’])`;
});
var string = letters.join('');
var regex = new RegExp(`(${string})`, `gi`);
var hits = clean.replace(regex, `<mark>$1</mark>`);
node.innerHTML = hits;
}
<input id='search' type='search'><input type='button' value='search'>
<article id='content'>
<p>Murphy, Kelly, O’Sullivan, Walsh, Smith, O’Brien, Byrne, Ryan, O’Connor, O’Neill, O’Reilly, Doyle, McCarthy, Gallagher, O’Doherty, Kennedy, Lynch, Murray, Quinn, Moore, McLoughlin, O’Carroll, Connolly, Daly, O’Connell, Wilson, Dunne, Brennan, Burke, Collins, Campbell, Clarke, Johnston, Hughes, O’Farrell, Fitzgerald, Brown, Martin, Maguire, Nolan, Flynn, Thompson, O’Callaghan, O’Donnell, Duffy, O’Mahony, Boyle, Healy, O’Shea, White, Sweeney, Hayes, Kavanagh, Power, McGrath, Moran, Brady, Stewart, Casey, Foley, Fitzpatrick, O’Leary, McDonnell, MacMahon, Donnelly, Regan, Donovan, Burns, Flanagan, Mullan, Barry, Kane, Robinson, Cunningham, Griffin, Kenny, Sheehan, Ward, Whelan, Lyons, Reid, Graham, Higgins, Cullen, Keane, King, Maher, MacKenna, Bell, Scott, Hogan, O’Keeffe, Magee, MacNamara, MacDonald, MacDermott, Molony, O’Rourke, Buckley, O’Dwyer</p>
</article>