use strict; use warnings; my $html = ">lt;amp; something else <gt;amp;something else ;"; $html =~ s|&(([^ ;]+;)+)| join '', map { "&$_;" } split /;/, $1 |ge; print "$html\n";