codice:
$text = "ciao";
if(preg_match("/(?(?=^\d{4}$))^[1-9]{4}$|^[a-z]{4}$/",$text,$ris))
echo "Sequenza corretta";
else
echo "Sequenza non corretta";
la struttura che hai indicato è corretta:
(?(condizione)pattern_si|pattern_no)
condizione può essere un numero oppure un'asserzione.
nell'esempio che ho postato uso ?=^\d{4}$ come asserzione in avanti positiva, ^[1-9]{4}$ come pattern in caso affermativo e ^[a-z]{4}$ come pattern in caso negativo.
in pratica cosa succede:
il preg_match controlla prima $text: se questo è un numero di 4 cifre (la mia asserzione) verifica ulteriormente che siano cifre comprese fra 1 e 9.
se la variabile $text iniziale non è un numero l'asserzione risulta non verificata e quindi guardo ^[a-z]{4}$, ossia controllo di avere una parola con lettere dalla a alla z minuscole.