No tengo del todo claro lo que pretendes hacer, pero creo que cambiando el pattern solucionaría tu problema.
Código PHP:
if(preg_match("/^[a-zA-Z0-9áéíóúüñÁÉÍÓÚÜÑ ]+$/", $categoria)) {
Podrías usar var_dump para verificar que es lo que te está llegando efectivamente:
Código PHP:
var_dump($_POST['categoria']);
¿Estás teniendo en cuenta el juego de caracteres?