A pues voy a dejar que otro conteste, así como hiciste, jajajaja
Además no pides un porque en el primer post
Edito: Es que no puedo dejarlo sin contestación,
La razón es porque el simbolo
| lo que dice que verifique el patrón de la izquierda, que en el caso de que no tuviera el - debería hacer un match de algo similiar a A123 (porque lo que haces es algo como (A-Z){1}(0-9){3} un caracter y tres números) o el de la derecha que solo dice que verifica un match que tenga de la
a a la
z y que sean tres caracteres. Como el primero no se cumple, entonces el segundo sí y eso es lo que muestra. Ahora cuando se le añade el simbolo de -, entonces el patrón busca primero si existe algo como A-123 (porque lo que haces es algo como (A-Z){1}-(0-9){3} un caracter, el simbolo de menos y tres dígitos). Al encontrar el match, ya es suficiente y no continúa porque el preg_match busca la primera ocurrencia. Para más información de lo que hace (?<=.......) recomiendo esta lectura
http://www.php.net/manual/en/regexp....assertions.php