>perl -wMstrict -le "my $s = 'foobar baz \"x\" %&*'; print qq{'$s'}; ;; $s =~ s{ < ([^>]+) > ((?: (?! }{$2}xmsg; print qq{'$s'}; ;; ;; $s = 'foo bar \"stuff\" *&!'; print qq{'$s'}; ;; my @tags = qw(b cd); my $tag = join '|', @tags; $tag = qr{ (?i) $tag }xms; use re 'eval'; $s =~ s{ < \s* ($tag) \s* > ((?: (?! ]*) (?(?{ lc($1) ne lc($^N) }) (*F)) \s* > } {$2}xmsg; print qq{'$s'}; " 'foobar baz "x" %&*' 'foobar baz "x" %&*' 'foo bar "stuff" *&!' 'foo bar "stuff" *&!' #### >perl -wMstrict -le "my $s = 'foo bar \"stuff\" *&! baz'; print qq{'$s'}; ;; my $ar_tag_delete_content = [ 1, tag_group_regex(qw(efg) ) ]; my $ar_tag_leave_content = [ 0, tag_group_regex(qw(b cd)) ]; ;; for my $pass ($ar_tag_leave_content, $ar_tag_delete_content) { my ($delete_content, $tag) = @$pass; use re 'eval'; $s =~ s{ < \s* ($tag) \s* > ((?: (?! ]*) (?(?{ lc($1) ne lc($^N) }) (*F)) \s* > } { $delete_content ? '' : $2 }xmsge; print qq{'$s'}; } ;; sub tag_group_regex { my $alternation = join '|', @_; return qr{ (?i) $alternation }xms; } " 'foo bar "stuff" *&! baz' 'foo bar "stuff" *&! baz' 'foo "stuff" *&! baz' #### >perl -wMstrict -le "my @strings = ( 'foo bar \"stuff\" *&! baz', 'fee P fie Q foe R fum S', 'hee W hie X hoe Y hum Z', ); ;; my $ar_keep_tag_content = [ 1, tag_group_regex(qw(b cd)) ]; my $ar_kill_tag_content = [ 0, tag_group_regex(qw(efg) ) ]; ;; for my $s (@strings) { print qq{'$s'}; for my $pass ($ar_keep_tag_content, $ar_kill_tag_content) { my ($keep_content, $tag) = @$pass; $s =~ s{ < \s* ($tag) \s* > (.*?) } { $keep_content ? $2 : '' }xmsge; print qq{'$s'}; } print ''; } ;; sub tag_group_regex { my $alternation = join '|', @_; return qr{ (?i) $alternation }xms; } " 'foo bar "stuff" *&! baz' 'foo bar "stuff" *&! baz' 'foo "stuff" *&! baz' 'fee P fie Q foe R fum S' 'fee P fie Q foe R fum S' 'fee P fie Q R S' 'hee W hie X hoe Y hum Z' 'hee W hie X hoe Y hum Z' 'hee W hie X Y Z'