#!/usr/bin/perl use Text::Balanced qw{extract_multiple extract_bracketed extract_delimited extract_tagged}; my $text = '

paragraphBOLD text

link text

Some new text in bold and cursive

test

'; local $\ = $/; print "text= $text"; my @stack; my $error; @fields = extract_multiple($text, [ { Tag => sub { extract_tagged($_[0]) } }, { Brack => sub { extract_bracketed($_[0],'<>') } }, ], undef, 0 ); foreach my $elem (@fields){ if(ref( $elem ) eq 'Tag'){ (print_stack(), $error--) if defined $error; print "OK Tag: ".$$elem; } elsif(ref $elem eq 'Brack'){ my ($otag) = $$elem =~ m#<([a-zA-Z0-9]+)>#; my ($ctag) = $$elem =~ m##; add_to_stack($otag) if defined $otag; remove_from_stack($ctag) if defined $ctag; } else { $error = 1; } } sub print_stack { foreach my $tag (@stack){ print "not properly closed: ". $tag if defined $tag; } } sub add_to_stack { push @stack, shift; } sub remove_from_stack { my $tag = shift; foreach my $c (reverse 0 .. @stack) { delete $stack[$c] if($stack[$c] eq $tag ) } } #### text=

paragraphBOLD text

link text

Some new text in bold and cursive

test

not properly closed: b OK Tag: link text not properly closed: i OK Tag:

test