Lo que sucede es lo siguiente:
Cita: /[1-31]/
/[1-12]/
/[1920-1993]/
Estas expresiones no funcionan como imaginas, los rangos solo consisten de dos caracteres: [a-z], [0-9] etc... cualquier otro carácter no se considera para el rango.
En la primer expresión: /[1-31]/ lo único que está validando es la presencia de algún numero del 1 al 3, pues el último 1 ya está declarado.
Mira un ejemplo claro de lo que hace:
Código PHP:
echo preg_match('/^[1900-2000]$/', 1912) ? 1 : -1;
Esto siempre te va a dar -1 aunque creas que 1912 está dentro del rango [1900-2000], pero sigue habiendo un error, y si hacemos esto:
Código PHP:
echo preg_match('/[1900-2000]/', 99) ? 1 : -1;
Nos dará siempre 1, y así:
Código PHP:
echo preg_match('/[1900-2000]/', 88) ? 1 : -1;
Nos dará -1 pues el 8 no esta dentro del rango, en resumen, la expresión [1920-1933] considerará solo los números 1,9,2,0-1(rango),9,3,3 y no de otra forma.
Espero que te quede claro cual es tu error.