Modificadores de expresiones regulares en php

Cuándo empecé a aprender a construir expresiones regulares en php me parecían un auténtico coñazo!!!! Poco a poco le voy tomando el gustillo. Vamos a ver hoy los modificadores más importante utilizados en expresiones regulares en php teniendo en cuenta la sintaxis de patrones PCRE. Antes de seguir, si eres totalmente nuevo en las expresiones regulares te recomiendo el artículo "Construir expresiones regulares en php".

Los patrones de expresiones regulares, regex, son una excelente forma de elegir, filtrar o reemplazar cadenas de texto, números o bloques completos de código. Nunca usé mucho los modificadores pero últimamente me he visto en la necesidad de su uso para hacer mis expresiones regulares más funcionales ante variadas situaciones. Así que vamos a ver los modificadores más importantes de expresiones regulares que se pueden utilizar en php y algunos ejemplos.

Letras mayúsculas y minúsculas

El modificador i (PCRE_CASELESS) es utilizado cuándo se quiere buscar una determinada secuencia de letras tanto si son mayúsculas como minúsculas (vea expresión regular insensible a mayúsculas).

Buscar coincidencias a lo largo de múltiples líneas

Por defecto, php utiliza el patrón de una expresión regular hasta que se encuentra con un carácter de salto de línea (linebreak). El modificador m (PCRE_MULTILINE) hace que la búsqueda se realice a lo largo de múltiples líneas.

Ejemplo:

<?php
$str = 'Hola Carabola'; if (preg_match('/^Carabola$/', $str)) echo 'Sí'; // esto no funcionará if (preg_match('/^Carabola$/m', $str)) echo 'Sí, funciona en multi-linea!;
?>

El primer test no se imprimirá la palabra "Sí" pues la búsqueda de "Carabola" será negativa al estar la palabra buscada después de un salto de línea. En el segundo caso sí se encuentra ya que se ha utilizado el modificador m en la expresión regular para hacer la búsqueda a lo largo de todas las líneas (búsqueda multi-linea),

Buscar cualquier carácter, incluso el carácter new-line (nueva línea)

El punto en una expresión regular coincide con cualquier carácter excepto el carácter nueva línea, por ello a veces el modificador m no es suficiente. Para que el punto coincida con cualquier carácter, incluido el carácter new-line (nueva línea) hay que usar el modificador s (PCRE_DOTALL). Las clases de caracteres excluyentes, tipo [^a], siempre coinciden con el carácter new-line, se utilice o no el modificador s.

Ignorar los espacios en blanco

Puedes verte en el caso de querer seleccionar alguna cadena de texto situada entre un determinado tag HTML. En este caso, y otros muchos, puede ser útil el uso del modificador x (PCRE_EXTENDED) pues hará que se ignoren todos los espacios en blanco. Los caracteres de espacio en blanco que sean escapados dentro del patrón de la expresión regular no serán ignorados o cuándo se encuentren en el interior de una clase de caracteres.

Modificador de codicia

El modificador U (PCRE_UNGREEDY) es el llamado modificador de codicia. Por defecto, los meta-caracteres cuantificadores de una expresión regular en php son codiciosos, intentan coincidir con el máximo número de coincidencias posibles. Al poner el modificador U, los meta-caracteres cuantificadores no serán codiciosos.

Ejemplo:

Con codicia (por defecto):

<?php
  $string = '<a href="http://www.undominio.com" title="Visitame">Mi web</a>';
  $regex = '/(\"|\').*\1/';
  $result = preg_match($regex,$string,$co);
  if($result){
   print_r($co);
  }
//se imprime Array ( [0] => "http://www.undominio.com" title="Visitame" [1] => " )
?>

Sin codicia utilizando el modificador U:

<?php
  $string = '<a href="http://www.undominio.com" title="Visitame">Mi web</a>';
  $regex = '/(\"|\').*\1/U';
  $result = preg_match($regex,$string,$co);
  if($result){
    print_r($co);
  }
//imprime Array ( [0] => "http://www.undominio.com" [1] => " )
?>

El cambio de la codicia se puede conseguir también de otras formas, por ejemplo, utilizando el meta-carácter ? junto a otro meta-carácter cuantificador. Por ejemplo, el regex anterior seria equivalente a:

$regex = '/(\"|\').*?\1/';

Existen otros modificadores, como el modificador u (PCRE8, para tratar la cadena como UTF-8, vea buscar palabras completas en UTF-8) pero creo que estos pueden ser los más importantes. Puedes ver más modificadores para php en el manual.



Comentarios (0)

Smileys

:confused::cool::cry::laugh::lol::normal::blush::rolleyes::sad::shocked::sick::sleeping::smile::surprised::tongue::unsure::whistle::wink: