1

私はPerlが初めてです。複数行で検索して置換する必要があります。

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

これらのコードを試しました。ファイル内のすべてのタグが置き換えられます。誰かが私を助けてくれる私の間違いは何ですか?

私のタグは、

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

現在は

<picture></picture> 
4

3 に答える 3

3

あなたがやりたいと思うことに基づいて、ここにあなたが変更する必要があるものがあります。一致する最初のタグを実際に閉じるかどうかに関係なく、式<picture>は最初のタグまでのすべてのタグと一致します。</picture>

<picture>タグをネストすることは違法であると仮定すると<picture></picture>、置換の置換セクションに追加するだけで済みます。次に例を示します。

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

ヒント: スラッシュを含む式を扱う場合は、スラッシュをエスケープする必要がないように、次のようにします。

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

これはまだ完璧ではありません!たとえば、次のようになります。

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

次のものに置き換えられます。

<picture></picture></picture>

しかし今では、正規表現だけでは不十分であり、おそらく XML パーサーが必要になるところまで来ています。

于 2012-10-01T14:28:56.573 に答える
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;
    }
}
于 2012-10-02T15:37:17.937 に答える
1

Sinan の答えはうまくいきますが、( MojoliciousフレームワークMojo::DOMの一部である) などの DOM パーサーを使用することは、さらに良い解決策かもしれません。次に、次のような非常に単純な操作を実行できます

#!/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;
于 2012-10-02T17:38:40.060 に答える