So for the sake of completeness, and posterity... and not because anyone cares, here's the final version that I decided fixed things up the way I wanted. Turns out by reordering the substr I was able to remove the space ambiguity I was seeing in one of my example data failures where I was getting nested span tags.
sub spandiffstr {
my ( $old, $new ) = @_;
my $span = '<span>';
my $espan = '</span>';
( $old ^ $new ) =~ /^\0*/ and my $subscr = $+[0];
substr $old, $subscr, 0, $span;
substr $new, $subscr, 0, $span;
my ( $rold, $rnew ) = map scalar reverse, $old, $new;
( $rold ^ $rnew ) =~ /^\0*/ and my $lsubscr = -$+[0];
my $losubscr = $lsubscr;
unless ($lsubscr) {
$losubscr = length $old;
$lsubscr = length $new;
}
substr $old, $losubscr, 0, $espan;
substr $new, $lsubscr, 0, $espan;
return $old, $new;
}
Thanks for all the fish!