Regex - это общеизвестно неправильный инструмент для большей части этой работы;он предназначен для манипулирования строками, а не структурированными данными, такими как HTML.К счастью, вы уже находитесь в браузере, поэтому у вас есть целый набор инструментов, предназначенных для манипулирования DOM: вы также можете его использовать.(Вы также пометили вопрос с помощью jQuery, что делает его еще проще.)
Обновление: я неправильно прочитал детали в вопросе и извлекал строку поиска из атрибута родительского узлавместо внешне;Я также не смог сделать поиск нечувствительным к регистру.Оба исправлены ниже:
// Make a case-insensitive regex from the search string
let str = 'aa';
let re = new RegExp(str, "gi");
// operate only on the .search-text nodes:
$('.search-text').each(function(i, el) {
// get the current contents of the element:
let text = $(el).html();
// Add your highlights:
text = text.replace(re, '<span class="highlight-text">$&</span>');
// insert the modified text back into the DOM:
$(el).html(text);
})
.highlight-text {
background-color: #FFC
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span class="whatever-class custom-class-name" attribute="Whatever 1 AAA">AAA BBB</span>
<span class="search-text custom-class-name" attribute="Whatever 2 AAA">Text AAA</span> I
Это действительно безопасно, только если у элементов .search-text
нет дочерних узлов. обычно будет работать, даже если они содержат некоторый HTML, но только если:
- Вы уверены, что выделенные строки никогда не будут соответствовать частям самого HTML,и
- нет никаких привязок событий, прикрепленных к элементам DOM (этот скрипт заменяет содержимое
.search-text
wholesale.)
Например, при попытке выделить слово "span "в HTML-строке, содержащей <span>
элементов, приведет к недопустимому HTML:
// same script as above
$('.search-text').each(function(i, el) {
let text = $(el).html();
let highlights = $(el).attr("attribute").split(" ");
for (str of highlights) {
text = text.replace(str, '<span class="highlight-text">' + str + '</span>');
}
$(el).html(text);
})
.highlight-text {
background-color: #FFC
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span class="search-text" attribute="span">Text AAA <span>test</span></span>
Начиная со строки
Если отправной точкой является строка HTML вместо уже построенного дерева DOM, все, что вам нужнонужно сначала преобразовать эту строку во фрагмент документа, чтобы вы могли использовать на нем следующие инструменты DOM:
let fragment = $('<template>');
fragment.html($yourStringHere);
/* manipulate fragment contents as above, then */
return fragment.html();