La funzione fa sicuramente al caso tuo, in caso sono io che non faccio al caso della funzione
Prova questa:

con accentate
codice:
if (!preg_match("/^([^\W_0-9]+[0-9]+)+|([0-9]+[^\W_0-9]+)+[^\W_]?$/i",$testo))
echo "testo non valido";
senza accentate
codice:
if (!preg_match("/^([a-z]+[0-9]+)+|([0-9]+[a-z]+)+[a-z0-9]?$/i",$testo))
echo "testo non valido";