我想替换HTML文档中与模式匹配的所有字符,但HTML标记内的模式除外。如何使用Perl或sed使用正则表达式?
示例:将所有“a”替换为“b”,但如果“{”替换为<a href="aaa">
等HTML标记,则不会。
答案 0 :(得分:2)
正如评论中所指出的,HTML解析器是解决您问题的理想解决方案,但是如果您出于任何原因想要使用正则表达式,以下方法将起作用:
a(?![^<]*>)
Working example on RegExr和the same for input.
<强> And in 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
^ ^ ^ ^ ^
答案 1 :(得分:0)
恢复这个古老的问题,因为它有一个没有提到的简单解决方案。
关于使用正则表达式解析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";
请参阅此live demo
参考