Регулярное выражение исключает гиперссылки - PullRequest
0 голосов
/ 25 апреля 2020

Я выделяю некоторый текст, например так:

var newHTML = oldHTML.replaceAll(filter, "<span class='highlight'>" + filter + "</span>");

У меня есть эта функция, которую я использую для замены html содержимого.

String.prototype.replaceAll = function (search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};

Поскольку я не хочу тормозить никакие гиперссылки (но я хочу сохранить другие теги html, чтобы сохранить форматирование), мне нужно исключить теги <a href>. Кто-нибудь знает, как?

Изменить, пример ввода и вывода, чтобы уточнить:

input

<a href="https://www.youtube.com" target="_blank">youtube</a>

выделять только текст YouTube (соответствует только второй "YouTube")

<a href="https://www.youtube.com" target="_blank"><span class="highlight">youtube</span></a>

Правка 2, нашел его - это нужное мне регулярное выражение.

youtube(?!([^<]+)?>)

Почему-то это не работает в моей функции (нет совпадений для

input.replaceAll("youtube","<span class='highlight'>youtube</span>")

). Есть догадки почему?

String.prototype.replaceAll = function (search, replacement) {
var target = this;
//return target.replace(new RegExp(search, 'g'), replacement);

var regex = "/" + search + "(?!([^<]+)?>)/g";
return target.replace(regex, replacement);

};

1 Ответ

1 голос
/ 25 апреля 2020

Не уверен насчет политики сообщества Javascript в SO, но, возможно, отрицательные отзывы заключаются в том, что было бы лучше проанализировать HTML как HTML, а не как манипулирование строками / регулярными выражениями. Таким образом, вы можете легко проверить наличие TextNode, а затем заменить содержимое текстовых узлов.

Тем не менее, это регулярное выражение должно быть началом для вас:

(?<=>[^<]*)youtube

Имейте в виду, что это использует Lookbehinds, которые не поддерживаются всеми браузерами AFAIK, поэтому это может быть полезно для Chrome et c если у вас есть работа над проектом через строки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...