Sintaxis de expresiones regulares de PCRE
PHP Manual

Sub-patrones condicionales

Es posible hacer que el proceso de comparación obedezca a un sub-patrón condicionalmente o que elija entre dos sub-patrones alternativos, dependiendo del resultado de una declaración o de si un sub-patrón de captura previo coincidió o no. Las dos formas posibles de un sub-patrón condicional son

(?(condición)patrón-sí)
(?(condición)patrón-sí|patrón-no)

Si la condición es satisfecha, se usa el patrón-sí; de otro modo se usa el patrón-no (si está presente). Si hay más de dos alternativas en el sub-patrón, se producirá un error en tiempo de compilación.

Hay dos tipos de condiciones. Si el texto entre los paréntesis consisite en una secuencia de dígitos, la condición es satisfecha si el sub-patrón de captura de ese número ha coincidido anteriormente. Considere el siguiente patrón, el cual contiene espacios en blanco no significativos para hacerlo más legible (se asume la opción PCRE_EXTENDED) y para dividirlo en tres partes para facilitar su análisis:

( \( )?    [^()]+    (?(1) \) )

La primera parte compara un paréntesis de apertura opcional, y si el carácter está presente, lo establece como la primera subcadena capturada. La segunda parte compara uno o más caracteres que no sean paréntesis. La tercera parte es un patrón condicional que examina el primer conjunto de paréntesis coincididos o no. Si lo fueron, es decir, si el sujeto comenzó con un paréntesis de apertura, la condición es TRUE, y así el patrón-sí se ejecuta y es requerido un paréntesis de cierre. De otra manera, ya que el patrón-no no está presente, el subpatrón no coincidirá con nada. En otras palabras, este patrón coincide con una secuencia que no tenga paréntesis, opcionalmente encerrada entre paréntesis.

Si la condición es la cadena (R), se satisface si ha sido hecha una llamada recursiva al patrón o sub-patrón. En el "nivel superior", la condición es falsa.

Si la condición no es una secuencia de dígitos o (R), debe de ser una declaración. Ésta puede ser una declaración de búsqueda hacia delante o hacia atrás, negativa o positiva. Considere este patrón, conteniendo de nuevo espacios en blanco no significativos, y con dos alternativas en la segunda línea:

(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

La condición es una declaración de búsqueda hacia delante positiva que compara una secuencia opcional de algo que no sean letras seguida de una letra. En otras palabras, comprueba la presencia de al menos una letra en el sujeto. Si se encuentra una letra, el sujeto se compara con la primera alternativa; de otro modo se compara con la segunda. Este patrón coincide con cadenas en una de las dos formas dd-aaa-dd o dd-dd-dd, donde aaa son letras y dd son dígitos.


Sintaxis de expresiones regulares de PCRE
PHP Manual