GrandFather's approach is the way to go.
Here's what your regex is doing:
[ ] is really "&" or "n" or "b" or "s" or "p" or ";" since it is inside a character class. This should have been obvious since Dumper shows you "nbsp;", even though it wasn't inside capturing parenthesis,
and it mysteriously left off the "&"!
Also, since everything is optional (you're using two ?'s and a .*?), your minimal match is nothing at all inbetween the tags, which succeeds.
P.S. Pass a reference to Dumper:
print Dumper \@results;