Lo que quiero saber es si la estructura es siempre la misma... o sea si todos los DNI's tienen 8 números seguidos de una letra.
De ser así te puedes evitar las expresiones regulares y utilizar subcadenas. Una subcadena que tome los 8 primeros caracteres y otra que tome el último.
Código PHP:
$dni = "2222222J";
$numeros_dni = substr($dni, 0, 8);
$letra_dni = substr($dni, -1);
Más info en
http://www.php.net/manual/es/function.substr.php
Saludos