Regexp en PHP (expresiones regulares)

Resumen del uso de las expresiones regulares en PHP.

Delimitadores

Hay que poner dos delimitadores en la regexp, al inicio y al final, normalmente se usan:

/<PATRÓN>/
#<PATRÓN>#
~<PATRÓN>~
Modificadores de patrones:

Después del delimitador final de un patrón se puede incluir un modificador de patrón:

  • i Case Insensitive, las coincidencias no tienen en cuenta si el caracter es mayus o minus.
  • m Multiline, trata al input como una única línea con saltos de línea dentro de ella.
  • s DOTALL, el metacaracter «.» incluirá también nuevas líneas.
Ejemplo de uso: 
#<REGEXP>#mi 
para multilínea y case Insensitive
Metacaracteres:

Caracteres especiales para control, si se quiere usar su carácter real como parte del patrón textual se debe escapar con el backslash «\» (Ej: «\^» para el carácter «^» en lugar del inicio de línea).

  • \ escapado de metacaracter
  • ^ (acento circunflejo) inicio de sujeto
  • $ fin de sujeto
  • . Cualquier caracter (menos nueva línea)
  • | Indica un OR, alternativas de coincidencia, habitualmente entre paréntesis: (<ELEC1>|<ELEC2>), una de las elecciones puede estar vacía, siendo así una de las alternativas la cadena vacía.
  • ( ) delimitadores de subpatrón.
  • [ ] delimitadores de una clase carácter (conjunto de alternativas de caracteres).
Metacaracteres por secuencias de escape:

Caracteres que, al ser escapados, se convierten en metacaracteres predefinidos:

  • \f salto de página
  • \n salto de línea
  • \r retorno de carro
  • \R salto de línea (coincidencia con \n, \r y \r\n, útil para evitar problemas entre SO’s).
  • \t tab
  • \d decimal
  • \D NO \d
  • \s espacio en blanco
  • \S NO \s
  • \h caracter de espaciado horizontal (tab, espacio)
  • \H NO \h
  • \v caracter de espaciado vertical (\n, \r)
  • \V NO \v
Cuantificadores:

Metacaracteres para el control de ocurrencias de un caracter, sub-patrón, el metacaracter punto o una clase caracter.

  • X? 0 ó 1 ocurrencias de X (ocurrencia opcional de X)
  • X* 0 a N ocurrencias de X
  • X+ 1 a N ocurrencias de X
  • X{} ó X{min} Repetición, min a max ocurrencias de X.
    Min y Max deben ser menores que 65536. Si sólo se pone «min» indica «exactamente min» veces.
    NOTA: X{0} no indica negación de X, en su lugar es ignorado.
Subpatrón:

(<SUB_PATRÓN>) delimitadores de subpatrón, las coincidencias encontradas entre estos paréntesis será devuelto al vector de coincidencias del preg_match (Máx = 65535). Se suele usar para acotar un conjunto de alternativas (OR, |) y para aplicar cuantificadores a sub-patrones.

Modificadores

  • (?:) Se puede usar como delimitador de subpatrón sin que sea capturado para el vector de resultados usando la notación «(?:)».
  • (?!) Negative look-ahead, indica que NO debe existir ese patrón para poder continuar con la Regexp. Ej: #(?!blah).# sería que devuelva true si hay cualquier caracter (menos nueva línea) y el string no comienza por «blah».

NOTA: Si el sub-patrón se combina con un cuantificador y se encuentra más de 1 vez dicho patrón, en el array resultante sólo se mostrará sólo el último «match». Ej:
Cuando (tweedle[dume]{3}\s*)+ se haya comparado totalmente con «tweedledum tweedledee», el valor del sub-patrón de captura será «tweedledee».

Clase carácter:

[<CLASE_CARACTER>] Indica un conjunto de caracteres predefinido o definido por el usuario.
Ej: [alpha] indica cualquier alfanumérico y [aeiou] indica cualquiera de esos caracteres que en este caso serían todas las vocales (y además es equivalente al subpatrón (a|e|i|o|u), pero es más eficiente la clase carácter).

Operadores:

Dentro de una clase carácter sólo se tienen los operadores a continuación listados ¡¡El resto de meta-caracteres serán tratados como caracteres normales!! Por ejemplo: [*$] indica el conjunto/clase carácter compuesto de un carácter asterisco y un símbolo del dólar, no indica un cuantificador ni un fin de sujeto:

[^] [^<CARACTERES/CLASE_PREDEFINIDA>] negación de la clase
[-] [<CARACTER_INI>-<CARACTER_FIN>] rango de caracteres

Conjuntos predefinidos:

Alfanuméricos:

  • alnum alfanumérico
  • alpha letras
  • lower minúsculas
  • upper mayúsculas
  • ascii caracteres del código ASCII entre 0 y 127
  • word palabras, esto es, conjunto de caracteres separados por espacios (eq: \w)
  • digit decimales (eq: \d)

De puntuación:

  • blank espacio o tab
  • space espacio en blanco

Imprimibles:

  • graph caracteres imprimibibles (EXcluyendo espacio)
  • print caracteres imprimibibles (INcluyendo espacio)
  • punt signos de puntuación (caracteres imprimibles que no sean letras ni dígitos).
«Codicia» en las Regexp

Recuerda que las expresiones regulares son «codiciosas» por defecto, esto es, intentan abarcar el patrón más largo posible siempre. El ejemplo típico es el de los delimitadores de comentarios en C:

/* primer comentario */ no comentado /* segundo comentario */

Si se intenta realizar el preg_match con un patrón

"/*.**/" 

la regexp cogerá desde la apertura del primer comentario hasta el último cierre (el del segundo comentario), en lugar de quedarse en el primer cierre.

Esto se puede evitar usando una interrogación después del cuantificador en cuestión para volverlo perezoso, ej: «*?»
Ó utilizar el cuantificador «*» seguido de un «distinto de ‘*’ «, es decir: «[^*]*», cualquier carácter que no sea el asterisco de 0 a N veces.

Deja un comentario