Ejemplo de expresiones regulares PHP

Las expresiones regulares son patrones de texto y permiten definir patrones de coincidencia y aplicarlos a cadenas de texto para conocer si esa cadena o parte de ella cumple el patrón al compararse, incluso realizan transformaciones de la cadena.

Ejemplo de expresiones regulares PHP

Barra / ... /

Si sabemos exáctamente la cadena que vamos a buscar, el patrón no será tan complicado, ya que únicamente indicaremos entre barras el patrón a buscar.

Para realizar las comparacione utilizaré la función preg_match() que realiza una comparación entre la cadena y el patrón dado. Generalmente, la búsqueda empieza por el inicio de la cadena a comparar, pero existe un parámetro opcional offset que lo utilizaremos para especificar el lugar alternativo desde donde se va a empezar a buscar 'en bytes'.
// Buscar una cadena dentro de otra (/ ... /) 

// Función que mostrará si existe o no, el patrón indicado 
function existeCadena( $valor ) {
   
    if ( $valor ){ // si existe patrón ... 
		
        echo "Patron existe en cadena.";
		
    }else { // si no existe patrón ... 
	
        echo "Patron no existe en cadena.";
		
	}
		
}

// Signo / ... / (patrón entre barras) sin espacios 
$patrCad=' / ab / ';
$cadena='aba';
existeCadena(preg_match ($patrCad, $cadena));
$patrCad=' / ab / ';
$cadena='bab';
existeCadena(preg_match ($patrCad, $cadena));
$patrCad=' / eb / ';
$cadena='baba';
existeCadena(preg_match ($patrCad, $cadena));
$patrCad=' / ab / ';
$cadena='ba';
existeCadena(preg_match ($patrCad, $cadena)); 
Patron existe en cadena.

Patron existe en cadena.

Patron no existe en cadena.

Patron no existe en cadena.

// Expresión como parámetro de preg_match()	
echo "Comparar cadena: JavaScript
      Patrón comparación: /SCRI/i
      ¿ Existe coincidencia ? ";
	
	// '\i' indica que patrón será insensible a mayúsculas y minúsculas 	
	if (preg_match("/SCRI/i", " JavaScript " ) ) {
		
		echo ", existe una coincidencia."; // Devuelve Sí 	
		
	} else {
		
		echo "No, no existe ninguna coincidencia.";
		
	} 

Comparar cadena: JavaScript
Patrón comparación: /SCRI/i
¿ Existe coincidencia ?

, existe una coincidencia.

Subir

Ancla inicio/fin ^ y $

Metacaracteres de posicionamiento o ancla

Los símbolos ^, $ Indican donde debe estar situado el patrón que hemos indicado, dentro de la cadena para buscar sí existen coincidencias.
Con el signo ^: El patrón debe aparecer al inicio de la cadena de carácteres a comparar.
Con el signo $: El patrón debe aparecer al final del conjunto de caracteres a comparar, o antes de un carácter de nueva linea.

// Meta caracteres de posicionamiento, o anclas (^ circunflejo), ($ dolar)

// Función que mostrará si existe o no, el patrón indicado 
function existePatron( $valor ) {
   
    if ( $valor ){ // si existe patrón ... 
		
        echo "Patron existe en cadena.";
		
    }else { // si no existe patrón ... 
	
        echo "Patron no existe en cadena.";
		
	}
		
}

// Signo ^ (patrón al inicio de cadena de caracteres) 
$patrAncla=' /^ab/ ';
$cadena='aba';
existePatron(preg_match ($patrAncla, $cadena));
$patrAncla=' /^ab/ ';
$cadena='bab';
existePatron(preg_match ($patrAncla, $cadena));
$patrAncla=' /^ab/ ';
$cadena='baba';
existePatron(preg_match ($patrAncla, $cadena));

// Signo $ (patrón al final del conjunto de caracteres) 
$patrAncla=' /ab$/ ';
$cadena='aba';
existePatron(preg_match ($patrAncla, $cadena));
$patrAncla=' /ab$/ ';
$cadena='bab';
existePatron(preg_match ($patrAncla, $cadena));
$patrAncla=' /ab$/ ';
$cadena='baba';
existePatron(preg_match ($patrAncla, $cadena)); 
Patron existe en cadena.

Patron no existe en cadena.

Patron no existe en cadena.

Patron no existe en cadena.

Patron existe en cadena.

Patron no existe en cadena.

Subir

Barra invertida (\)

Si necesitamos incluir en nuestro patrón cualquier metacarácter como un signo literal, usaremos el carácter de escape ( \ ), la barra invertida. De esta forma si incluimos por jemplo el símbolo dolar ($) como significado literal de moneda, debemos incluir delante de este, la barra invertida (\).

Otros caracteres que requieren la barra invertida para ser usados con otros fines:
. \ + * ? [] () {} = ! <> | : ^ y $ como hemos dicho.

// Barra invertida, escapar carácter 
function escapaCaracter( $valor ) {
    
	if ( $valor ){
		
        echo "Patron escapando carácter: existe en cadena.";
		
    } else {
	
        echo "Patron sin escapar carácter: no existe en cadena.";
	
	}
		
}

// Carácter que termine con 410 
$patrEscapar = '/410$/'; 
$cadena = '410$';

echo "Cadena a comparar: '410$' ";

escapaCaracter( preg_match ($patrEscapar, $cadena ) ); // No existe

// Escapar símbolo dolar $ 
// Carácter que termine con 410$ 
$patrEscapar = '/410\$$/';
$cadena = '410$';
escapaCaracter( preg_match ($patrEscapar, $cadena ) ); // Sí existe  

Cadena a comparar: /410$/

Patron sin escapar carácter: no existe en cadena.

Patron escapando carácter: existe en cadena.

Subir

Punto (.)

El punto (.) entre el patrón puede representar a cualquier caracter, el único caracter que no puede representar es la nueva línea (\n).

// Metacarácter punto (.) 
function rsltPunto( $valor ) {
    
	if ( $valor ){
		
        echo "Patron existe en cadena.";
		
    } else {
	
        echo "Patron no existe en cadena.";
	
	}
		
}

// Un punto indica la búsqueda a partir del primer carácter. 
$patrPunto = '/^.P/';
$cadena = 'PHP';
rsltPunto( preg_match ( $patrPunto, $cadena ) ); // No existe, ya que apunta a la 'H'

// Tres puntos indican la búsqueda a partir del tercer carácter.
// Si el patrón contiene más de un carácter la comparación se
// hará con el mismo orden en que están colocados en el patrón. 
$patrPunto = '/^...ip/';
$cadena = 'script';
rsltPunto( preg_match ( $patrPunto, $cadena ) ); // Sí existe, coinciden en orden y situación  
Patron no existe en cadena.

Patron existe en cadena.

Subir

Cuantificadores - * ? + n n, n,m

Indican en que número deben encontrarse presentes en la cadena para que haya una coincidencia. Estos son los más utilizados * ? +

// Metacarácter cuantificador o multiplicador 
function rsltCuanti( $valor ) {
    
	if ( $valor ){
		
        echo "Patron existe en cadena.";
		
    } else {
	
        echo "Patron no existe en cadena.";
	
	}
		
}
 
// * 0 o infinitas veces
// ? una vez o ninguna
// + Por lo menos una vez 
 
$patrCuanti = '/ot*/'; // 0 o muchas veces 
$cadena = 'otttt';
rsltCuanti( preg_match ($patrCuanti, $cadena)); // Existe 

$patrCuanti = '/.*ot*/'; // Puede aparecer 0 o más veces en cualquier posición. 
$cadena = 'por ejemplo otttt';
rsltCuanti( preg_match ($patrCuanti, \$cadena)); // Existe 

$patrCuanti = '/j+ot*/'; // Puede aparecer después del carácter 'j' 1 o más veces, en cualquier posición. 
$cadena = 'otttt';
rsltCuanti( preg_match ($patrCuanti, $cadena)); // No existe 

$patrCuanti = '/j?ot*/'; // Puede aparecer después del carácter 'j' 0 o 1 vez, en cualquier posición. 
$cadena = 'otttt';
rsltCuanti( preg_match ($patrCuanti, $cadena)); // Existe 
Patron existe en cadena.

Patron existe en cadena.

Patron no existe en cadena.

Patron existe en cadena.

// { ... } Otra forma de representar los cuantificadores 

function rsltCuanti2( $valor ) {
    
	if ( $valor ){
		
        echo "Patron existe en cadena.";
		
    } else {
	
        echo "Patron no existe en cadena.";
	
	}
		
}


// {1,} Por lo menos una vez 

$patrCuanti2 = '/ot{0,}/'; // 0 o muchas veces 
$cadena = 'otttt';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe 

// Cualquier carácter (.) y 2 caracteres más adelante, puede aparecer, 3 veces el patrón indicado   
$patrCuanti2 = '/.{2,3}ot/'; 
$cadena = 'ooottt';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe 

// Puede aparecer después de 'H' o posición 0, 3 veces el patrón indicado o 0 o más veces con (*) 
$patrCuanti2 = '/H{0,3}ot*/';
$cadena = 'otttttt';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe 

// Puede aparecer después de '1 f', 1 vez el patrón indicado o 0 o más veces con (*) 
$patrCuanti2 = '/f{1,1}ot*/';
otttt = 'afotttt';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe 

// Puede aparecer después de '2 H', 2 veces el patrón indicado o 0 o más veces con (*) 
$patrCuanti2 = '/H{2,2}ot*/';
$cadena = 'HHotototot';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe 

// Puede aparecer después de '3 H', 3 veces el patrón indicado o 0 o más veces con (*) 
$patrCuanti2 = '/H{3,3}ot*/';
$cadena = 'HHHotttt';
rsltCuanti2( preg_match ($patrCuanti2, $cadena)); // Existe  

Otra forma de representar los cuantificadores:

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Subir

Metacaracteres de rango [ ... ] corchetes

Para especificar un rango de caracteres utilizaremos los corchetes [], dentro de ellos indicamos un patrón, que será el rango válido a comparar. Basta que exista cualquiera de ellos para que se de la condición.

// Metacaracteres de rango 
function rslrRango( $valor ) {
    
	if ( $valor ){
		
        echo "Patron existe en cadena.";
		
    } else {
	
        echo "Patron no existe en cadena.";
	
	}
		
}
 
// |, un rango o el otro
// ^, circunflejo dentro de [] corchetes es negación [^a] 

$patrRango="/[a-z]/"; // Rango de la 'a' hasta la 'z'. 
$cadena = "flash";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/[a-z]/"; // Rango de la 'a' hasta la 'z' minúsculas. 
$cadena = "FLASH";
rslrRango( preg_matche ($patrRango, $cadena)); // No existe 

$patrRango = "/[a-z]|[A-Z]/"; // Rango de la 'a' hasta la 'z' mayúsculas y minúsculas. 
$cadena = "FLASH";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/[aA-zZ]/"; // Rango de la 'a' hasta la 'z' mayúsculas y minúsculas. 
$cadena = "FlasH";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/Ros[ai]/"; // Rango que precede con 'a' o 'i'. 
$cadena = "Rosa";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/[Rosa] | [Rosi]/"; // Puede aparecer uno de los dos rangos mediante '|' 
$cadena = "Rosa";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/[rR][Oo][Ss][AaIi]/"; // Rango mayúsculas y minúsculas carácter a carácter. 
$cadena = "Rosi";
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

$patrRango = "/[rR][Oo][Ss][AaIi][Ss]/"; // Rango mayúsculas y minúsculas carácter a carácter. 
$cadena = "Rosa";
rslrRango( preg_matche ($patrRango, $cadena)); // No existe 

// Rango mayúsculas y minúsculas carácter a carácter.
// El último carácter indica que puede aparecer 0 o 1 vez. 
$patrRango = "/[rR][Oo][Ss][Aa][Ss]?/"; 
$cadena = "Rosa\;
rslrRango( preg_matche ($patrRango, $cadena)); // Existe 

// Rango en cualquier posición, cadena sin el carácter 'a' mediante '^a'
// e indicamos que la cadena termine con caracteres 'sa'. 
$patrRango = "/.[^a]sa/"; 
$cadena = "casa";
rslrRango( preg_matche ($patrRango, $cadena)); // No existe  
Patron existe en cadena.

Patron no existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron existe en cadena.

Patron no existe en cadena.

Patron existe en cadena.

Patron no existe en cadena.

Cuidado con las reglas de sintaxis de las expresiones regulares ya que no se aplican igual dentro de los corchetes que fuera. Un ejemplo es el metacarácter ^, dentro de corchetes no sirve de ancla, sino de caracter negador. Dentro de corchetes solo debemos escapar los siguientes metacaracteres con barra invertida \:

___ \d dígitos decimales.
___ \D cualquier carácter que no sea un dígitos.
___ \w cualquier carácter, tildes, ñ, _, digitos, etc …
___ \W cualquier carácter que no pueda ser parte de una palabra (letra, número, guión bajo).
___ \s espacio en blanco, retorno, tabulación, nueva linea.
___ \S cualquier carácter que no sea espacio en blanco, retorno, tabulación, nueva linea.
___ i Insensible a mayúsculas y minúsculas.

Subir

Obtener el nombre del host de una URL

// Obtiene el nombre del host de la URL mediante la comparación de dos patrones 
preg_match ('@^(?:http://)?([^/]+)@i',
    " http://www.php.net/index.html ", $coincidencias);
$host = $coincidencias[1];  // Este patrón obtiene 'www.meudiseny.com' y lo guarda en '$host'  

echo "Buscar coincidencias entre: <br />
Cadena ____ http://www.php.net/index.html <br />
Patrón _____ '/[^.]+\.[^.]+$/'"; <br />

// Obtiene los dos últimos segmentos del nombre del host 
preg_match ('/[^.]+\.[^.]+$/', $host, $coincidencias);

// A partir del primer punto '[^.]', recoge los demás caracteres
// '+\.' puede haber uno o más de un punto y desde el inicio de ese punto '[\.]'
// '+' recoger todos los caracteres detrás del punto hasta el final de la cadena '$'  
echo "Nombre de dominio: { $coincidencias[0] }"; 

Buscar coincidencias entre:
Cadena ____ http://www.meudiseny.com/index.html
Patrón _____ '@^(?:http://)?([^/]+)@i'

Nombre de dominio: www.meudiseny.com

Buscar coincidencias entre:
Cadena ____ www.meudiseny.com
Patrón _____ '/[^.]+\.[^.]+$/'

Nombre de dominio: meudiseny.com

Si se pasa el tercer perámetro en preg_match(), entonces éste se llena con los resultados de la búsqueda. $coincidencias[0] contendrá el texto que coincidió con el patrón completo, $coincidencias[1] tendrá el texto que coincidió con el primer subpatrón entre paréntesis capturado, y así sucesivamente.