2012-10-01 39 views
1

我是新来的Perl。我必须在多行中找到并替换。使用Perl,我如何删除HTML文档中特定标签的内容?

$content =~ s/<picture[^>]*>(.*?)<\/picture>//gis; 

我试过这些代码。所有的标签都在我的文件中被替换。任何人帮助我的错误是什么?

我的标签,

<picture width='960' height='705' baseline='360'> 
    <pict-header> 
    </pict-header> 
</picture> 

现在

<picture></picture> 
+0

要澄清一下,您想要删除标签中的任何标签以及该标签上的任何属性? – mkb

+0

是的,我已经删除了所有属性和''中所有标签的内部。 – dinesh

回答

3

根据我想你想要做的更换,这里是你需要改变什么。您的表情与任何<picture>标记相匹配,直至第一个</picture>标记,无论它是否确实关闭了您匹配的第一个标记。

假设是非法的巢<picture>标签,所有你需要做的是在替代置换部分添加<picture></picture>,如:

$content =~ s/<picture[^>]*>(.*?)<\/picture>/<picture><\/picture>/gis; 

提示:如果您有斜杠在其中表达处理,做这样的事情,所以你不需要逃避你的斜线:

$content =~ [email protected]<picture[^>]*>(.*?)</picture>@<picture></picture>@gis; 

这还不完美!例如,这样的:

<picture stuff="adfgerth"><picture stuff="235wefw45"><somejunk /></picture></picture> 

将被替换为:

<picture></picture></picture>

但现在你已经得到了其中一个正则表达式是不够的点,你可能需要一个XML解析器。

+0

“(。?*)$含量=〜S/] *><\/picture>/<\/picture>/GIS;”不会在我的文件中替换这些代码。 – dinesh

+0

您是逐行加载输入行还是将整个内容加载到单个缓冲区中?你需要做后者来进行多行搜索。通常'while(<>){stuff}'不起作用。 – mkb

+0

'open(FOUT,“> $ filename”)||死(“无法打开文件”); foreach my $ line(@fcont){ $ line =〜s/] *>(。*?)<\/picture>/<\/picture>/gis; print FOUT $ line; } 关闭FOUT;'这些我的代码。 – dinesh

2

您可以通过使用HTML解析器来解析HTML节省大量的头痛:

#!/usr/bin/env perl 

use strict; use warnings; 
use HTML::TokeParser::Simple; 

die "Need filename\n" unless @ARGV == 1; 
my ($filename) = @ARGV; 

my $parser = HTML::TokeParser::Simple->new(file => $filename); 

while (my $token = $parser->get_token) { 
    if ($token->is_start_tag('picture')) { 
     $parser->get_tag('/picture'); 
     print "<picture></picture>"; 
    } 
    else { 
     print $token->as_is; 
    } 
} 
1

思南的答复工作,但更好的解决办法可能是使用DOM解析器,如Mojo::DOM(这是部分Mojolicious框架)。然后,您可以执行一些非常简单的操作,例如

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Mojo::DOM; 

my $content = <<'END'; 
<picture width='960' height='705' baseline='360'> 
    <pict-header> 
    </pict-header> 
</picture> 
END 

my $dom = Mojo::DOM->new($content); 

$dom->at('picture')->replace('<picture></picture>')->root; 

print $dom; 
相关问题