2009-08-11 147 views
1

我正在将一组网页升级到新系统,并且我想剥离并替换每页顶部的样板,并将其替换为新的样板。幸运的是,每个页面都有一个内容表,并且没有任何表格。我想要做的事情如下:如何从HTML文档中删除表格?

$contents =~ s/^.*<table/$newHeader/ 

这只适用于$内容的第一行。有没有办法用我的新样板替换文件中第一个<表之前(包括)的所有内容?

回答

7

你可以使用Perl的“/s”选项,告诉它“.”包括换行符(处理字符串作为一个巨大的线,而不是每行)所有字符匹配。您可以通过使用?量词限制了比赛的第一个表,使*非贪婪:

$contents =~ s/^.*?<table/$newHeader/s 

而且,只记得更换也将去掉文本“<table”所以你需要做确保它被插回在某种程度上,可能与:

$contents =~ s/^.*?<table/<table$newHeader/s 

或者你可以使用一个零宽度正先行断言,它说“下面的比赛中,这种表达也必须匹配”,但在文本前瞻断言不被视为匹配的一部分(因此不会被替换) :

$contents =~ s/^.*?(?=<table)/$newHeader/s 

而这将使“<table”完好无损。

+0

完美。谢谢! – 2009-08-11 16:34:59

+1

这是一个很好的答案,但它不是完美的*。/s选项会使点匹配空白是不正确的。即使没有任何选项,点也可以匹配空格。将“空格”替换为“换行符”,答案确实很完美。 – innaM 2009-08-11 18:07:48

+0

@曼尼:你说的对,修好了。 – 2009-08-11 19:54:58

3

“。”通常匹配除换行符之外的任何字符。将“s”附加到您的正则表达式中,使其匹配多行:

$contents =~ s/^.*?<table/$newHeader/s;