3

次のような入力文字列が与えられます。

"blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something else</b>"

次のような結果文字列を生成する PERL 正規表現を書きたいと思います。

"blah <b>abc <i>foo</i>  bar </b> GETME <b>something else</b>

と の間の「GETME」が削除さ<b></b>ています。<b>基本的に、開始タグと終了タグの間にある「GETME」のすべてのインスタンスを削除したいと考えてい</b>ます。

これに対処する「バランスの取れた」パッケージがあるのを見てきましたが、やり過ぎのようです。もっと簡単な解決策はありますか?

何かのようなもの:

$teststr =~ s/(<b>[^>]*?)GETME(.*?<\/b>)/$1$2/g;

<i>の間にa のようなネストされたタグがない場合にのみ機能します。<b></b>

理想的には、次のように書くことができます。

$teststr =~ s/<b>(.*?)</b>/{$1 =~ s/GETME//g}/g;

別の正規表現をネストする場所ですが、そのようなことが可能であれば、構文がわかりません。

4

1 に答える 1

5

次のようなパーサーを使用しますXML::Twig

#!/usr/bin/env perl;

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new(
    twig_roots => {
        'b' => sub {
            $_->subs_text( qr{\bGETME\b}, '' );
            $_->print;
        },  
    },  
    twig_print_outside_roots => 1,
)->parse(
    '<root>blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something</b></root>'
);

次の結果が得られます。

<root>blah <b>abc <i>foo</i>  bar </b> GETME <b>something</b></root>
于 2013-10-28T16:50:58.820 に答える