使用perl regex删除标记之间的字符串

Mik*_*e M 3 regex perl

给定一个这样的输入字符串:

"blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something else</b>"
Run Code Online (Sandbox Code Playgroud)

我想写一个PERL正则表达式,产生一个结果字符串,如:

"blah <b>abc <i>foo</i>  bar </b> GETME <b>something else</b>
Run Code Online (Sandbox Code Playgroud)

其中的"GETME" <b>,并</b>已被删除.基本上我想删除开始<b>和结束</b>标记之间的所有"GETME"实例.

我已经看到有一个"平衡"包来处理这个问题,但它似乎有点矫枉过正.有更简单的解决方案吗?

就像是:

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

但是只有在没有嵌套标签的情况下才有效,但是<i><b>和之间</b>.

理想情况下我可以这样写:

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

我嵌套另一个正则表达式,但如果这样的话可能,我不知道语法.

Bir*_*rei 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>'
);
Run Code Online (Sandbox Code Playgroud)

它产生:

<root>blah <b>abc <i>foo</i>  bar </b> GETME <b>something</b></root>
Run Code Online (Sandbox Code Playgroud)