Замените символы в HTML-документе, который соответствует регулярному выражению, за исключением тех, что внутри тегов

Я хочу заменить все символы, соответствующие шаблону, в HTML-документе, кроме тех, которые находятся внутри тегов HTML. Как вы это делаете с помощью регулярного выражения с использованием Perl или sed?

Пример: замените все "a" на "b", но не если "a" находится в теге HTML, например <a href="aaa">.

Ответ 1

Как указано в комментариях, синтаксический анализатор HTML является идеальным решением для вашей проблемы, однако если вы по какой-либо причине хотите использовать регулярное выражение, будет работать следующее:

a(?![^<]*>)

Рабочий пример в RegExr и то же самое для ввода.

И в Perl:

$var = "salut <a href='a.html'></a> ah ha <a href='about.asp' /> animal";
#        ^     ^       ^         ^  ^   ^  ^       ^     ^       ^   ^
$var =~ s/a(?![^<]*>)/b/g;
print $var;

Вывод:

sblut <a href='a.html'></a> bh hb <a href='about.asp' /> bnimbl
 ^                          ^   ^                        ^   ^

Ответ 2

Воскрешая этот древний вопрос, потому что у него было простое решение, о котором не упоминалось.

При всех отказах в использовании regex для синтаксического анализа html, это простой способ сделать это.

#!/usr/bin/perl
$regex = '<[^>]*|(a)';
$subject = 'aig arother <a href="aaa">';
($replaced = $subject) =~ s/$regex/
if (defined $1)  {"b";} else {$&;} /eg;
print $replaced . "\n";

Смотрите живая демонстрация

Ссылка

Как сопоставить шаблон, за исключением ситуаций s1, s2, s3

Как сопоставить шаблон, если...