Ver índice
Expresiones regulares

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Búsqueda y reemplazamiento de textos

PHP dispone de varias opciones para realizar tareas de búsqueda y reemplazamiento de textos. La más antigua, POSIX (Portable Operating System Interface uniX), se anuncia como deprecated a partir de PHP 5.3. Por esa razón centraremos nuestro análisis en la llamada PCRE (Perl Compatible Regular Expressions) que parece ser la opción con más futuro.

Una expresión regular o patrón de búsqueda, es una forma de describir un conjunto de cadenas de carácteres sin enumerar sus elementos. En el caso de las expresiones regulares compatibles con Perl (PCRE) hemos de empezar diciendo que han tener señalado su comienzo y su final por dos caracteres idénticos llamados delimitadores pudiendo realizar esa función cualquier carácter no alfanumérico.

Expresiones tales como: #tomate#, *tomate* o /tomate/ serían patrones válidos, delimitados por #, * o /, para la búsqueda de la palabra tomate.

Empezaremos considerando el caso de que una coincidencia requiera encontrar una identidad plena con el patrón. Más adelante incidiremos sobre el tema de los patrones de búsqueda y el manejo de su amplísimo abanico de opciones.

Aunque lo trataremos con detalle un poco más adelante vamos a empezar a manejar el modificador i. Cuando este carácter es añadido detrás del último delimitador modifica el patrón de búsqueda para considerar las coincidencias sin hacer distinción entre mayúsculas y minúsculas. Si no se incluyera i la búsqueda atendería al criterio de que mayúscula y minúscula son caracteres diferentes.

El reemplazamiento

Para poder ilustrar de forma gráfica las características de los diferentes patrones de búsqueda empezaremos por conocer el manejo de la función:

preg_replace ( patron, sustituta, cadena, limite_coincidencias, $contador )

dónde patron es el patrón de búsqueda, sustituta la cadena que va a sustituir las coincidencias, cadena la cadena en la que pretendemos realizar la búsqueda y sustitución, limite_coincidencias el número máximo de coincidencias a las que aplicaremos el reemplazamiento y $contador será el nombre de una variable que puede utilizarse como contador del número de cambios efectuados.

<?php
/* definimos la cadena en la que pretendemos
 realizar la búsqueda y sustitución */
$original = <<<Cadena
 Esta es la cadena que utilizaremos como original.
 Sobre ella efectuaremos algunos cambios utilizando
 EXPRESIONES REGULARES
Cadena;
/*establecemos lo que queremos buscar*/
  $buscar="es";
   /*establecemos lo que queremos sustituya a lo anterior
   que será marcar en rojo con fondo amarillo los mismos caracteres*/
  $sustituto="<span style='color:red;background-color:yellow'>es</span>";
  /*elegimos un delimitador para el patrón de búsqueda ( / ) */
  $delimitador="/";
  /* establecemos el modificador i para buscar
     sin diferencias mayúsculas de minúsculas */
  $modificador="i";
  /* recogemos en la variable $patron la expresión regular
     formada por el delimitador inicial, la cadena a buscar,
     el delimitador final y, en este caso, el modificador i */
  $patron=$delimitador.$buscar.$delimitador.$modificador;
  print "<br />Mediante el patrón de búsqueda: <b><i>".$patron."</i></b>";
  print " buscaremos <b><i>".$buscar."</i></b> en la cadena:<br />";
  print "<i>".$original."</i><br>";
  print " reemplazando <b><i>".$buscar."</i></b> por  ";
  print "<b><i>".$sustituto."</i></b><br />";
  print " Este es el resultado: <b><br />";
  print preg_replace ($patron,$sustituto,$original);
  print "</b><br /><br />";
  print "Agregemos una restricción en cuanto a coincidencias (1)<br /><b>";
  print preg_replace ($patron,$sustituto,$original,1);
  print "</b><br /><br />Incluyamos un contador de coincidencias <br><b>";
  print preg_replace ($patron,$sustituto,$original,-1,$z);
  print "</b><br /><br />Hemos realizado ".$z." cambios";
  /* cambiemos el modificador para que sea sensible
      a mayúsculas/minusculas */
  $modificador="";
  /* actualicemos la variable patrón con el último cambio */
  $patron=$delimitador.$buscar.$delimitador.$modificador;
  print "<br /><b>Búsqueda sensible a mayúsculas/minúsculas</b><br>";
  print "<br />Mediante el patrón de búsqueda: <b><i>".$patron."</i></b>";
  print " buscaremos <b><i>".$buscar."</i></b> en la cadena:";
  print "<i>".$original."</i><br>";
  print " reemplazando <b><i>".$buscar."</i></b> por  ";
  print "<b><i>".$sustituto."</i></b>";
  print " Este es el resultado: <b>";
  print preg_replace ($patron,$sustituto,$original);
  print "</b><br /><br />";
  print "Agregemos una restricción en cuanto a coincidencias (1)<br /><b>";
  print preg_replace ($patron,$sustituto,$original,1);
  print "</b><br /><br />Incluyamos un contador de coincidencias <br><b>";
  print preg_replace ($patron,$sustituto,$original,-1,$z);
  print "</b><br /><br />Hemos realizado ".$z." cambios";
?>
ejemplo79.php

Si se omiten los parámetros limite_coincidencias y $contador se reemplazarán todos los valores posibles sin recoger en ninguna variable el número de cambios. En el caso de que queramos indicar de forma explícita que se efectúen todos los cambios posibles asignaremos al cuarto parámetro (limite_coincidencias) el valor -1.

El parámetro patron puede ser un array en el que cada elemento será un patrón de búsqueda. Cuando se da esa circunstancia y sustituta es una cadena, las coincidencias de cada uno de los diferentes patrones son reemplazadas por la cadena sustituta.

En el caso de que sustituta fuera un array, las coincidencias del patron contenido en cada elemento de array serán reemplazadas por el valor del elemento de sustituta de igual índice tal como puede verse en los ejemplos de la tabla que incluimos a continuación. Hemos utilizado en todos los casos el modificador i razón por la cual las búsquedas serán insensibles a mayúsculas y minúsculas.

Función Descripción Código
fuente
Ver
ejemplo
preg_replace($patron, $sustituto, $original) Devuelve una cadena sistituyendo, sin límite de coincidencias, el contenido del patrón por la cadena de reemplazamiento Ver Probar
preg_replace($patron, $sustituto, $original,n) Devuelve una cadena sistituyendo el contenido. El cuarto parámetro (n) establece que solo se reemplazarán las n primeras coincidencias Ver Probar
$contador=0;
preg_replace($patron, $sustituto, $original, -1, $contador)
Devuelve una cadena sistituyendo el contenido. El cuarto parámetro (-1) establece que se reemplazarán todas las coincidencias. La variable contador, incluida como quinto parámetro recoge el número de ocurrencias Ver Probar
$patron=array('/xxx/','/yyy/');
preg_replace($patron, $sustituto, $original)
Cuando el patrón es un array (cada elemento ha de incluir los delimitadores) se sustituye cada coincidencia con cualquiera de los elementos del array por la cadena de reemplazamiento Ver Probar
$patron=array('/xxx/','/yyy/');
preg_replace($patron, $sustituto, $original,n)
En el caso de un patrón en forma de array el límite de coincidencias trata individualmente cada elemento del array Ver Probar
$contador=0;
$patron=array('/xxx/','/yyy/');
preg_replace($patron, $sustituto, $original,n,$contador)
Si se incluye el parámetro contador se cuantificarán todos los cambios realizados. Ver Probar
$contador=0;
$patron=array('/xxx/','/yyy/');
$sustituto=array('/zzz/','/ppp/');preg_replace($patron, $sustituto, $original)
Aquí utilizaremos dos arrays. Uno para establecer los patrones y otro para establecer los reemplazamientos asociados con aquellos Ver Probar
$contador=0;
$patron=array('/xxx/','/yyy/');
$sustituto=array('/zzz/','/ppp/');preg_replace($patron, $sustituto, $original)
Cuando el patron es un array de mayor longitud que el sustituto las sustituciones no definidas serán consideradas como cadenas vacías Ver Probar
$contador=0;
$patron=array('/xxx/','/yyy/');
$sustituto=array('/zzz/','/ppp/');preg_replace($patron, $sustituto, $original)
Cuando el patron es un array de menor longitud que el sustituto los elementos sobrantes de este no producirán ningún efecto Ver Probar

Patrones de búsqueda

La auténtica potencia de las expresiones regulares radica en el enorme abanico de opciones búsqueda que se pueden configurar utilizando: metacaracteres, indicadores de codicia, secuencias de escape, anclas, indicadores de alternancia, agrupadores, subpatrones y los diferentes tipos de modificadores. Veamos la utilidad de cada una de estas herramientas.

Metacaracteres

Llamaremos metacaracteres a un conjunto de carácteres que tienen un significado especial cuando se incluyen en una expresión regular. A título puramente enumerativo, forman parte de ese conjunto los siguientes: ., +, *, {, }, [, ], -, \, ^, $, |, (, ) y ?. Veamos sus significados:

.

Cuando incluimos un punto como metacaracter en un patrón de búsqueda estamos indicado que se admite cualquier carácter en la posición que ocupa el punto. Es decir, el patrón p. consideraría coincidencia tanto pa, como pz, como p3.

+

Cuando un patrón incluye un signo más se está especificando que el carácter que le precede puede repetirse una o más veces. Es decir pa+ consideraría coincidencias a: pa, paa, paaa y también a paaaaaaa.

*

Este metacaracter es ligeramente diferente al anterior. También permite repeticiones pero no obliga a que aparezca el carácter que le precede. Es decir, el patrón pa* consideraría coincidencias a: pa, paa, paaa y también p3 y pz que no incluyen ninguna a detrás de la p.

{m,n}

Cuando se incluyen esta expresión (en la que m y n son dos números naturales) a continuación de un caracter cualquiera se especifica que se considerará coincidencia cualquier cadena que contenga ese carácter repetido un número veces comprendido entre m y n ambos inclusive. Quiere decir que pa{3,5} considerará coincidencias a paaa, paaaa y paaaaa pero no considerará tal coincidencia en el caso de paa o de paaaaaa.

Existen casos particulares. Cuando se incluye {m} se está estableciendo que solo se considerará coincidencia cuando el caracter se repita exactamente m veces. Si se especifica {m,} (se incluye la coma pero falta el segundo valor) estaremos indicando que se considerará coincidencia cuando el carácter se repita m o más veces.

[ ]

Mediante los corchetes se pueden incluir rangos de caracteres en el patrón de búsqueda. Si se especifican letras o números sin ningún separador se considerará coincidencia cualquiera de ellos. Si se separan por medio de un guión dos números o dos letras se considerará coincidencia cualquiera del rango delimitado por ellos. Puedes verlo en los ejemplos.

^

Cuando este símbolo (acento circunflejo) se incluye como primer carácter dentro de un corchete será interpretado como negación, es decir, no se considerará coincidencia la expresión que le preceda.

Patrón de búsqueda Descripción Código
fuente
Ver
ejemplo
o Escribe una "o" marcada con colores sustituyendo a cada "o" de la cadena original sin diferenciar mayúsculas de minúsculas. Es idéntico al caso del los ejemplos anteriores Ver Probar
d. Considerará coincidencias todas las d junto su carácter siguiente sea cual fuere (el punto indica que puede ser un carácter cualquiera). Cada coincidencia la reemplazará por do sin diferenciar mayúsculas de minúsculas Ver Probar
do* Considerará coincidencias todas las "d" seguida de una "o" repetida cero o más veces. Cada coincidencia será reemplazada por "do" Ver Probar
do+ Considerará coincidencia cada "d" seguida de una "o" repetida una o más veces y reemplazará cada coincidencia por "do" Ver Probar
o{3} Considerará coincidencia tres "o" consecutivas (ooo) y reemplazará cada coincidencia por una "a" Ver Probar
o{1,} Considerará coincidencia cada uno de los grupos cada "o", "oo", "ooo..." sin importar cuantas "o" formen el grupo reemplazando cada coincidencia por una "o" coloreada Ver Probar
o{2,4} Considerará coincidencia los grupos "oo", "ooo" "oooo" (entre 2 y 4 repeticiones) y reemplazará por por una "a" cada una de las coincidencias Ver Probar
[abcd]Considera coincidencia uno cualquiera de los caracteres incluidos en el corchete y las sustituye por *VerProbar
[^abcd]Considera coincidencia cualquiera de los caracteres distintos a los incluidos en el corchete y sustituirá cada una de ellas por un *VerProbar
[a-h]Considera coincidencia cualquier caracter comprendido entre a y h (ambos inclusive)VerProbar
[^a-h]Considera coincidencia cualquier caracter no comprendido entre a y h (ambos inclusive)VerProbar
[0-9]Considera coincidencia cualquier dígito comprendido entre 0 y 9 (ambos inclusive)VerProbar
[^0-9]Considera coincidencia cualquier dígito no comprendido entre 0 y 9 (ambos inclusive)VerProbar
Cuando se utilizan expresiones del tipo[0-9], [A-Z] los extremos de los intervalos se delimitan por los valores de los códigos ASCII del primero y último de los caracteres entendiendo como valores pertenencientes a ese rango aquellos carácteres cuyo código ASCII pertenezca a ese intervalo. El código ASCII de A es 65, el de Z es 90, el de a es 97 y el de z es 122.
Hemos de prestar mucha atención a los extremos ya que si estableciéramos un rango como [a-Z] estaríamos indicando un intervalo inaceptable ya que comenzaría en 97 y acabaría en 90 (ha de ser siempre mayor el segundo valor que el primero) y nos daría error tal como puedes ver en este enlace

Los signos utilizados como metacaracteres pueden plantear problemas en los casos en los que pretendamos incluirlos como un carácter más en un patrón de búsqueda. Para utilizarlos de esta forma es necesario «escaparlos», es decir, anteponerles el carácter \. De esa forma serían interpretados como texto.

Además de la utilidad mencionada en los párrafos anteriores, cuando se antepone el carácter de escape a algunos carácteres (distintos de los metacaracteres) se activan algunas condiciones especiales tal como puedes ver en la tabla de ejemplos que tienes a la derecha.

La función: $r= preg_quote($c, $d) recoge en la variable $r el resultado de aplicar esa secuencia de escape a la cadena contenida como parámetro en la variable $c. El parámetro $d deberá recoger el carácter delimitador del patrón de búsqueda.

En esta tabla recogemos algunos ejemplos del uso de las secuencias de escape en los patrones de búsqueda.

Patrón de búsqueda Descripción Código
fuente
Ver
ejemplo
\dConsidera coincidencia cualquier caracter que sea un dígito comprendido entre 0 y 9 (ambos inclusive). Equivale a [0-9]VerProbar
\DConsidera coincidencia cualquier caracter que no sea un dígito comprendido entre 0 y 9 (ambos inclusive). Equivale a [^0-9]VerProbar
\sConsidera coincidencia los espacios en blancoVerProbar
\SConsidera coincidencia cualquier caracter que no sea un espacio en blancoVerProbar
\wConsidera coincidencia cualquier carácter de la "a" a la "z" (excluyendo la ñ y caracteres con tilde) o cualquier número del 0 al 9. No incluye los espacios entre las coincidenciasVerProbar
\WConsidera NO COINCIDENCIA cualquier carácter de la "a" a la "z" (excluyendo la ñ y caracteres con tilde) o cualquier número del 0 al 9VerProbar
\nConsidera coincidencia los saltos de línea (no se consideran como tal las etiquetas <br>)VerProbar
\/Al anteponerle el \ a un metacaracter es considerado como un carácter normal en la cadena de búsqueda. Si no lo hiciéramos nos daría un mensaje de errorVerProbar
    En este ejemplo puede verse la utilidad de la función preg_quoteVerProbar

Alternacias

La alternancia utiliza el carácter | para permitir una elección entre dos o más alternativas. Cuando se conjugan incluidas entre paréntesis y teniendo en cuenta que los paréntesis pueden agruparse y/o anidarse pueden construirse expresiones tan complejas como necesitemos.

Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
a|b|cSe considera coincidencia la presencia de uno cualquiera de los caracteres. Todas la coincidencias se reemplazarán por *VerProbar
(a|b)(c|d)Se considera coincidencia la presencia de uno cualquiera de los caracteres del primer paréntesis segudio de uno de los caracteres del segundo. Serán coincidencias: ac, ad, bc y bd. Todas la coincidencias se reemplazarán por *VerProbar

Anclas

En los ejemplos que hemos visto hasta ahora las coincidencias podrían producirse en cualquier parte de la cadena en la que efectuamos la búsqueda. Estas condiciones pueden modificarse restringiendo la búsqueda al principio o al final de la cadena de búsqueda. Para el primer caso se antepone al patrón el metacaracter ^.

  ¡Cuidado!  

El metacaracter ^ tiene dos utilidades manifiestamente distintas. Dentro de un corchete [^a] significa negación («no igual a 'a'» en este caso) y fuera de él y como primer carácter del patrón ^[abc] o ^pepe hace labores de ancla para restringir la búsqueda al principio de la cadena.

El uso del modificador A produce el mismo efecto que el metacaracter ^.

Cuando se trata de buscar coincidencias únicamente al final de la cadena es necesario recurrir al metacarácter $ que debe ser incluido detrás del patrón de búsqueda. Tanto este metacarácter como ^ cambian su funcionalidad cuando se incluye el modificador m. Cuando se da esta situación considerará comienzo y final tanto el comienzo y el final de la cadena como las posiciones anteriores y posteriores al carácter de salto de línea \n tal como puedes ver en algunos de los ejemplos de la tabla siguiente.

Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
^[abcd]Considera coincidencia sólo si uno de los caracteres incluidos en el corchete aparece al comienzo de la cadenaVerProbar
/[abcd]/AUtilizando el modificador A en el patrón (en este caso incluimos los caracteres delimitadores en el patrón) se logra el mismo objetivo que en el ejemplo anteriorVerProbar
[abcd]$Considera de los caracteres incluidos entre corchetes al final de la cadenaVerProbar
/^[abcd]/miUtilizando el modificador m en el patrón se comprueban las coincidencias de los caracteres situados al comienzo de cada línea. Se considera perteneciente a una nueva línea cada el carácter que vaya inmediatamente después de la secuencia \n VerProbar
/[abcd]$/miUtilizando el modificador m en el patrón se comprueban las coincidencias de los caracteres situados al final de cada línea. Se considera último carácter de una línea al que precede a la secuencia \nVerProbar

Codicia

Se dice que las expresiones regulares son codiciosas porque, salvo que se especifique lo contrario, procuran que la coincidencia abarque el mayor número de caracteres posibles. Eso significaría que un patrón de búsqueda del tipo a.*z considerará como una sola coincidencia la porción de texto delimitado por la primera "a" de la cadena y la última "z".

La codicia puede invertirse de dos maneras. Una de ellas es modificar el patrón de búsqueda agregando el signo ? inmediatamente después de un indicador de repeticiones (+,* o {m,n}). De esa forma a.*?z consideraría como coincidencia la porción de texto delimitado por cada "a" de la cadena y la primera de las "z" que aparezcan después de ella.

La segunda forma de invertir la codicia es agregar el modificador U con lo cual la cadena patrón podría ser similar a esta: /a.*z/U con los mismos resultados descritos en el párrafo anterior.

ejemplo119.php Ver código fuente

Subpatrones

Cuando una expresión regular se encierra en un paréntesis pasa a constituir un subpatrón de captura que, por defecto, tiene dos utilidades prácticas. La primera es su condición de ser parte del patrón que la contenga incluidas las eventuales condiciones de alternancia (a|b) que pueda contener. Junto con esa función los subpatrones disponen de otra muy importante: la captura. Las coincidencias son almacenadas en memoria con la opción de poder ser utilizadas a través de lo que se conoce como retro referencias.

Fuera de una clase carácter, una barra invertida seguida por un dígito mayor que 0 es una retro-referencia a un subpatrón de captura anterior. La retro-referencia no recoge el subpatrón sino el valor de la cadena coincidente con el subpatrón al que alude. Las retro referencias pueden marcarse así: \\n, \\gn o \\g{n} siendo en los tres casos n el número de orden del sub-patrón contando de izquierda a derecha.

Veamos su comportamiento con un ejemplo. Si comparamos la cadena "Me gusta el atún rojo con tomate" con el patrón el ((atún|bonito)(blanco|rojo)) vamos a encontrar una coincidencia del patrón completo (atún rojo), y las coincidencias de cada uno de los subpatrones: atún en el caso del primero, y rojo en el caso del segundo. Tales coincidencias son numeradas para su uso como retro referencias por medio de números naturales 1, 2 y 3 que se corresponden con los paréntesis contados de izquierda a derecha.

Por ese criterio de asignación la retro referencia \1 (siempre se antepone \ para aludir a ellas) recogerá el valor atún rojo, \2 contendrá atún y \3 incluirá rojo.

Hay situaciones en las que no es necesario usar retro referencias y, dado que pueden ralentizar la operación y requerir abundante espacio de memoria, puede resulte conveniente desactivarlas.

Para ello basta con que incluyamos después del paréntesis de apertura del patrón (o del subpatrón) los metacaracteres ?:.

Aquí tienes algunos ejemplos de utilización de retro referencias.

Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
(a|b)\\1El subpatrón buscará el carácter a o b. El resultado será capturado como \1. Incluyendo la referencia a esa captura como carácter siguiente serán coincidentes con el patrón las cadenas aa y bb. VerProbar
(\w)(\w)\\2\\1El primer carácter será una letra ó número (\w) que ha de coincidir con el cuarto carácter de la cadena (\\1). El segundo puede ser también cualquier letra (\w) que ha de coincidir con el tercer carácter de la cadena(\\2)VerProbar
((\w)(\w))\\3\\2\\1El primer subpatrón (identificado mediante \1) sería el más exterior de todos (marcado en rojo). Incluye dos subpatrones que numerados de izquierda a derecha resultarán identificados por \\2 y \\3 (verde y azul respectivamente)VerProbar
((a|b)(c|d))\\1El primer subpatrón ha de contener una de las cadenas ac, ad, bc, o bd y, además ha de repetirse (\\1) por tanto serán coincidencias: acac, adad, bcbc y bdbdVerProbar
(?:a|b)\\1Dará error ya que ?: es el indicador de no captura lo cual hace inválida la referencia \\1VerProbar
(?:a|b)Eliminando la retroreferencia \\1 del ejemplo anterior funciona correctamenteVerProbar
((?:a|b)(?:c|d))\\1Funciona exactamente igual que el último ejemplo de la tabla anterior. Las referencias eliminadas no están incluidas en el patrón de búsqueda y por tanto no influyen en el resultadoVerProbar

Subpatrones especiales

Subpatrones modificadores

Entre los tipos especiales de subpatrones cabe hablar de los conocidos como subpatrones modificadores. Su función es la de incluir o excluir modificadores a lo largo del patrón de búsqueda. Dada su condición de subpatrones han de comienzar y terminar por paréntesis (). Por su carácter especial han de llevar ? después del paréntesis de apertura (?) y a continuación pueden incluir uno o varios modificadores. Si se trata de activarlo basta con poner el carácter representativo (A, i, m, etcétera) y para desactivarlos se incluye un signo menos (-) delante de ese carácter.

Por ejemplo (?A-im) activaría el modificador A, desactivaría el i y activaría el m siempre a partir de la posición del patrón de búsqueda en el que es incluido este subpatrón.

Subpatrones modificadores
Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
(?-i)[A-Z](?i)[a-z]*El primer subpatrón activa la opción sensible a mayúsculas/minúsculas y la aplica al primer carácter. Para los siguientes caracteres el subpatron (?i) vuelve a desactivar esa opción.VerProbar

Subpatrones con aserciones

Otra situación especial es el caso de las aserciones. En este caso se contemplan cuatro posibilidades. En subpatrón y(?=x) donde x e y son condiciones, exige que se cumpla la condición x inmediatamente después de hacerlo la condición y. Si cambiáramos el signo = por ! la expresión y(?!x) será interpretada como exigencia de que NO se cumpla la condición x después de hacerlo la condición y

Anteponiendo un < al signo = (o a !) podrían plantearse expresiones del tipo (?<=x)y ó (?<!x)y que serían exigencias del cumplimiento (o no cumplirse si se trata de !) de la condición x inmediatamente antes de que se cumpla la condición y.

Comprobación de los caracteres siguientes o anteriores - Aserciones o declaraciones
Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
(?<=[0-9])[a-z]Considera coincidencia cualquier letra ([a-z]) qué esté situada detrás de un número comprendido entre 0 y 9 ([0-9])VerProbar
(?<![0-9])[a-z]Considera coincidencias cualquier letra ([a-z]) qué NO ESTÉ situada detrás de un número comprendido entre 0 y 9 ([0-9])VerProbar
[0-9](?=[A-Z])Considera coincidencia cualquier número ([0-9]) qué vaya delante (lleve detrás) de una letra ([A-Z])VerProbar
[0-9](?![A-Z])Considera coincidencia cualquier número ([0-9]) qué NO VAYA delante (NO lleve detrás) una letra ([A-Z])VerProbar

Subpatrones condicionales

También existen los subpatrones condicionales que se comportan de una forma similar a los operadores condicionales. Mediante la sintaxis (?(x)y|z) o (?(x)y) se establecen dos posibilidades de coincidencia. Cuando se cumple la condición x será usado el patrón de búsqueda(o subpatrón) x. En caso de que no se cumpla la condición se utilizaría, en caso de haber sido especificado, el patrón z.

Las condiciones sólo pueden ser establecidas por retro referencias o mediante aserciones. Cuando se utilizan retro referencias no se aluden de la forma tradicional (\\n, \\gn o \\g{n}). En este caso bastaría incluir dentro del paréntesis que contiene la condición x el número de la retro referencia (n) sin anteponerle ningún otro carácter. Puedes verlo en los ejemplos de la tabla.

En la tabla que tienes a continuación hemos incluido una serie de ejemplos que contemplan algunas de las múltiples posibilidades que ofrecen los subpatrones condicionales. Es particularmente importante prestar mucha atención a la elaboración de los patrones para evitar resultados inesperados. En los ejemplos incluimos comentarios relativos a algunos de esos resultados que, de no tenerlos previstos, pueden parecer desconcertantes.

Caso en los que la condición es una retroreferencia
Patrones de búsquedaRepresentan aCódigo
fuente
Ver
ejemplo
([0-9]*)(?(1)[a-c]|[d-z])
Todos estos ejemplos tienen marcado en rojo el condicional, dentro de él van la retro referencia, el patrón que usará si se cumple la condición y el patrón que usará si no se cumple la condición.
VerProbar
(\"|\')(\<.*?)*(?(2)\\1|.*?\\1)
VerProbar
((a)|(b))(?(3) f| c)
VerProbar
([0-9]*)(?(1)[a-c])
Los ejemplos anteriores sin incluir patrón para el caso en que no se cumple la condición.

En los ejemplos se comenta lo relativo a los caracteres precedidos del símbolo \.
VerProbar
(\"|\')(\<.*?)*(?(2)\\1)
VerProbar
((a)|(b))(?(3) f)
VerProbar
([0-9]*)(?(1)|[d-z])
Ahora hemos quitado a los ejemplos iniciales el patrón para el caso de que se cumpla la condición. VerProbar
(\"|\')(\<.*?)*(?(2)|.*?\\1)
VerProbar
((a)|(b))(?(3)| c)
VerProbar
([0-9]*)(?(1))
Aquí hemos eliminado del condicional ambos patrones. VerProbar
(\"|\')(\<.*?)*(?(2))
VerProbar
((a)|(b))(?(3))
VerProbar
Caso en los que la condición es el resultado de una comparación de igualdad o desigualdad
Patrón de búsquedaRepresenta aCódigo
fuente
Ver
ejemplo
(?(?<=[0-9][a-z])H|más)Si se cumple la condición verde(un número delante de una letra) agrupa esa condición a la H para conformar la palabra a buscar. Si no se cumple aquella condición considera patrón de búsqueda la palabra "más" VerProbar
(?(?<![0-9][a-z])H|más)Si se cumple la condición verde(un número delante de una letra) agrupa esa condición a la H para conformar la palabra a buscar. Si no se cumple aquella condición considera patrón de búsqueda la palabra "más" VerProbar
H(?(?=[0-9][a-z])|más)Si se cumple la condición verde(un número delante de una letra) agrupa esa condición a la H para conformar la palabra a buscar. Si no se cumple aquella condición considera patrón de búsqueda la palabra "más" VerProbar

Utilizando las opciones que nos ofrecen cada uno de los elementos que hemos ido viendo a lo largo de esta página podremos componer patrones de búsqueda que satisfagan casi todas nuestras necesidades. Es evidente que a medida que aumentemos los niveles de exigencia los patrones pueden ir adquiriendo una estructura bastante compleja. Veamos, en la página siguiente, los usos que podemos dar a los patrones en PHP.

Otras funciones con expresiones regulares

La función preg_match

Cuando se trata únicamente de conocer la existencia o inexistencia de texto dentro de una cadena o de un fichero puede resultar útil la función:

preg_match( patron, cadena, $coincidencias )

realiza una búsqueda en la cadena por medio de la expresión regular incluida en el patron. Si encuentra alguna coincidencia devuelve el valor booleano TRUE, en caso contrario devuelve FALSE.

El parámetro $coincidencias es opcional. Cuando se incluye recogerá en un array con ese nombre los resultados de la búsqueda.