替换HTML文档中与正则表达式匹配的字符,但标记内的字符除外

时间:2013-11-28 11:55:48

标签: regex perl sed html-parsing

我想替换HTML文档中与模式匹配的所有字符,但HTML标记内的模式除外。如何使用Perl或sed使用正则表达式?

示例:将所有“a”替换为“b”,但如果“{”替换为<a href="aaa">等HTML标记,则不会。

2 个答案:

答案 0 :(得分:2)

正如评论中所指出的,HTML解析器是解决您问题的理想解决方案,但是如果您出于任何原因想要使用正则表达式,以下方法将起作用:

a(?![^<]*>)

Working example on RegExrthe 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

参考

How to match pattern except in situations s1, s2, s3

How to match a pattern unless...