Я хочу заменить все символы, соответствующие шаблону, в 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
Как сопоставить шаблон, если...