non a prioris c'est pas ca.
J'ai du y réfléchir quelques minutes.
Je sais pas comment preg_match fonctionne exactement.
Mais a mon avis, il prend le code du caractère a par exemple, et cherche dans la chaine s'il trouve le meme code (donc le meme caractère).
Mais tu utilises htmlentities !!!!
En UTF-8, å a un certain code disons 2550 (c'est pas le bon ^^)
Lorsque tu applique la fonction htmlentities : å est transformé en : å (il faut donc coder le &, a, r, i, n, g et ; en UTF-

.
Donc la regex va chercher le code 2550 dans la chaine, mais il ne le trouvera pas (si mon raisonement est correct !), car å n'est plus dans la chaine !
Il y a donc différentes solutions : tu codes en UTF-8, vérifies les regex et ensuite seulement htmlentities, ou alors tu autorises & et ; dans la regex (mais bon alors tu controles plus grand chose ... ).
Puis je te conseille aussi de vérifier la longueur des chaines, ainsi qu'une fonction qui vérifie qu'on tappe que des caractères (le nom '0' passerait le test de ta regex ... ).