Expresiones regulares en PHP

Una expresión regular es un patrón de caracteres que se repiten con cierto orden, por es se le llama regular porque es previsible, esta regulada por algún tipo de expresión matemática y podemos localizar ese patrón en cualquier cadena.

Las expresiones regulares se usan en varios campos como Analítica web o configuraciones avanzadas en .htaccess para SEO.

Para trabajar con expresiones regulares en PHP vamos a usar la función :

  • int preg_match ( string $patron , string $cadena [, array &$resultados [, int $flags = 0 [, int $offset = 0 ]]] )
  • $patron es la expresión que buscamos
  • $cadena es la cadena en la que buscamos
  • $resultados , Aquí no devolverá las coincidencias
  • $flags (PREG_OFFSET_CAPTURE) modificará el índice del vector devuelto, haciendo que cada cadena tenga un índice, por tanto se modificará $resultados y pasará de vector unidimensional a bidimensional
  • $offset, punto de partida

Usaremos normalmente: preg_match ( string $patron , string $cadena). Tener en cuenta que el patrón siempre deberá ir así: “/patron/”

Unos ejemplos simplificados de expresiones regulares en PHP

En los siguientes ejemplos vamos a buscar una cadena dentro de otra, es decir no estamos haciendo nada que no podamos hacer con las funciones de cadena que ya hemos visto en pasadas lecciones.

<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}

$patron='/am/';
$cadena='ama';
resultado(preg_match($patron,$cadena));
$patron='/am/';
$cadena='mam';
resultado(preg_match($patron,$cadena));
$patron='/am/';
$cadena='mama';
resultado(preg_match($patron,$cadena));
$patron='/am/';
$cadena='ma';
resultado(preg_match($patron,$cadena));
?>

Si sabemos desde el principio la cadena exacta a buscar, no es necesario intentar hacer un patrón complicado, podemos usar como patrón la misma cadena que buscamos. Pero si por ejemplo quisieramos buscar plurales como casa y casas o palabras como Pepa y Pepe la cosa se pone un poco más complicada. Para hacer esto primero debemos entender algunos conceptos:

 

Caracteres y meta caracteres

El patrón que usaremos, va a estar formado por un conjunto de carácteres (un grupo de letras, numeros o signos) o por meta caracteres que representan otros carácteres, o permiten una búsqueda contextual.

Meta caracteres mas usados en PHP

Los meta caracteres más usados en PHP son los que se describen a continuación
. * ? + [ ] ( ) { } ^ $ |

Meta caracteres de posicionamiento, o anclas

Son los signos ^ y $ sirven para indicar donde debe estar situado nuestro patrón dentro de la cadena para considerar que existe una coincidencia.

El signo ^ queremos decir que el patrón debe aparecer al principio de la cadena de carácteres comparada. Cuando usamos el signo $ estamos indicando que el patrón debe aparecer al final del conjunto de carácteres, más concretamente, antes de un caracter de nueva linea, veamos un ejemplo:

function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}
$patron='/^am/';
$cadena='ama';
resultado(preg_match($patron,$cadena));
$patron='/^am/';
$cadena='mam';
resultado(preg_match($patron,$cadena));
$patron='/^am/';
$cadena='mama';
resultado(preg_match($patron,$cadena));
$patron='/am$/';
$cadena='ama';
resultado(preg_match($patron,$cadena));
$patron='/am$/';
$cadena='mam';
resultado(preg_match($patron,$cadena));
$patron='/am$/';
$cadena='mama';
resultado(preg_match($patron,$cadena));
?>

Escapar caracteres en patrones

Puede suceder que necesitemos incluir en nuestro patrón algun metacaracter como signo literal, es decir, por si mismo y no por lo que representa. Para indicar esta finalidad usaremos un carácter de escape, la barra invertida .
Así, un patrón definido como 12$ no coincide con una cadena terminada en 12, y sí con 12$:

<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}
$patron='/120$/';
$cadena='120$';
resultado(preg_match($patron,$cadena));
$patron='/120\$$/';
$cadena='120$';
resultado(preg_match($patron,$cadena));
?>

El metacaracter “.” (punto)

Si un metacaracter es un caracter que puede representar a otros, entonces el punto es el metacaracter por excelencia. Un punto en el patrón representa cualquier caracter excepto nueva línea.

<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}
$patron='/^.d/';
$cadena='dedo';
resultado(preg_match($patron,$cadena));
$patron='/^..sa/';
$cadena='casa';
resultado(preg_match($patron,$cadena));
?>

Metacaracteres cuantificadores

Estos metacaracteres que se aplican al caracter o grupo de caracteres que les preceden indican en que número deben encontrarse presentes en la cadena para que haya una ocurrencia. Por ello se llaman cuantificadores o multiplicadores. Los mas usados son * ? +

<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}

//* 0 o infinitas veces
//? una vez o ninguna
//+ Por lo menos una vez

$patron='/ab*/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/.*ab*/';
$cadena='pongo lo que quiero abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j?ab*/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j+ab*/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
?>

También podemos usar las repeticiones de esta forma:

<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}

//{0,} 0 o infinitas veces
//{0,1} una vez o ninguna
//{1,} Por lo menos una vez

$patron='/ab{0,}/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/.{2,2}ab/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j{0,5}ab*/';
$cadena='abbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j{1,1}ab*/';
$cadena='jjabbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j{2,2}ab*/';
$cadena='jjabbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
$patron='/j{3,3}ab*/';
$cadena='jjabbbbbbbbbbbb';
resultado(preg_match($patron,$cadena));
?>

Metacaracteres de rango

Los corchetes [] incluidos en un patrón permiten especificar el rango de caracteres válidos a comparar. Basta que exista cualquiera de ellos para que se de la condición, por ejemplo.

<?
<?php
function resultado($valor)
	{
	if ($valor)
		{
		echo "<p>El patron esta contenido en la cadena</p>";
		}
	else
		echo "<p>El patron <b>no</b> esta contenido en la cadena</p>";
	}

//| una o otra
//^ dentro de [] es que no [^a]
$patron="/[a-z]/";
$cadena="hola";
resultado(preg_match($patron,$cadena));
$patron="/[a-z]/";
$cadena="HOLA";
resultado(preg_match($patron,$cadena));
$patron="/[a-z]|[A-Z]/";
$cadena="HOLA";
resultado(preg_match($patron,$cadena));
$patron="/[aA-zZ]/";
$cadena="HOLA";
resultado(preg_match($patron,$cadena));
$patron="/Pep[ae]/";
$cadena="Pepe";
resultado(preg_match($patron,$cadena));
$patron="/[Pepe]|[Pepa]/";
$cadena="Pepa";
resultado(preg_match($patron,$cadena));
$patron="/[pP][Ee][Pp][EeAa]/";
$cadena="PePa";
resultado(preg_match($patron,$cadena));
$patron="/[Cc][Aa][Ss][Aa][Ss]/";
$cadena="casa";
resultado(preg_match($patron,$cadena));
$patron="/[Cc][Aa][Ss][Aa][Ss]?/";
$cadena="casa";
resultado(preg_match($patron,$cadena));
$patron="/.[^a]sa/";
$cadena="casa";
resultado(preg_match($patron,$cadena));
?>

Una cuestión a recordar es que las reglas de sintaxis de las expresiones regulares no se aplican igual dentro de los corchetes. Por ejemplo, el metacarácter ^ no sirve aqui de ancla, sino de caracter negador. Tampoco es necesario escapar todos los metacaracteres con la barra invertida. Solo será necesario escapar los siguientes metacaracteres.

 

Originally posted 2011-03-30 17:13:34.

Deja un comentario