Manual completo y sencillo de Expresiones Regulares en PHP
Escrito por Alex Barros Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un patrón de búsqueda. Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increíblemente el trabajo.

PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg (Compatibles con Perl). Son muy similares, aúnque las segundas llegan a ser algo más potentes.
Una expresión regular, consiste en comparar un patrón frente a un texto, para comprobar si el texto contiene lo especificado en el patrón.
Por poner un par de ejemplos:
Patrón: in
Coindicen:
- intensidad
- cinta
- interior
Patrón: [mp]adre
Coindicen:
- Mi madre se llama Luisa
- Tu padre es jardinero
A continuación voy a repasar la sintaxis básica de una expresión regular
Sintaxis y metacaracteres
El punto
El punto representa cualquier caracter. Escribiendo un punto en un patrón querrás decir que ahí hay un caracter, cualquiera. Desde la A a la Z (en minúscula y mayúscula), del 0 al 9, o algún otro símbolo.
Ejemplos:
ca.a coincide con cana, cama, casa, caja, etc…
No coincide con casta ni caa
Principio y fin de cadena
Si queremos indicar al patrón qué es el principio de la cadena o qué es el final, debemos hacerlo con ^ para inicio y $ para final.
Ejemplos:
“^olivas” coincide con “olivas verdes“, pero no con “quiero olivas”
Cuantificadores
Para indicar que cierto elemento del patrón va a repetirse un número indeterminado de veces, usaremos + o * . Usando + queremos decir que el elemento anterior aparece una o más veces. Usando * queremos decir que el elemento anterior aparece cero o más veces.
Ejemplos:
“gafas+” coincide con “gafassss” pero no con “gafa”
sin embargo
“clo*aca” coincide con “claca“, “cloaca“, “cloooooooaca“, etc..
Si lo que queremos indicar al patrón es que un elemento puede que esté (una vez) o puede que no, lo haremos con el interrogante de la siguiente forma:
“coches?” coincide con “coche” y con “coches”
Para definir la cantidad de veces que va a repetirse el elemento, tendremos que hacer uso de las llaves: { }, indicando en su interior el intervalo, o la cantidad exacta de veces que va a repetirse.
Ejemplos:
“abc{4}” coincide con “abcccc“, pero no con “abc” ni “abcc“, etc…
“abc{1,3}” coincide con “abc“, “abcc“, “abccc“, pero no con “abcccc”
Si un parámetro queda vacío, significa “un número indeterminado“. Por ejemplo: “x{5,}” significa que la x ha de repetirse 5 veces, o más.
Rangos
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. Dentro de ellos pondremos cualquier cantidad de caracteres, uno a continuación del otro; o un rango del abecedario o de los números enteros del 0 al 9.
Ejemplos:
“c[ao]sa” coincide con “casa” y con “cosa”
“[a-f]” coincide con todos los caracteres alfabéticos de la “a” a la “f”
“[0-9][2-6][ANR]” coincide con “12A“, “35N“, “84R“, etc..
pero no con “21A“, ni “33L“, ni “3A“, etc…
Dentro de los corchetes, hay que tener en cuenta que el símbolo ^ ya no significa inicio, sinó que es un negador, es decir: “[^a-Z]” coincidirá con cualquier texto que NO tenga ningún caracter alfabético (ni minúsculas ni mayúsculas), y “^@ ” coincide con cualquier caracter excepto “@” y “espacio”
Alternancia
Para alternar entre varias opciones, usaremos el símbolo | (barra vertical, en los teclados suele ser “Alt Gr + 1″). Con este mecanismo haremos un disyuntor, que nos permitirá dar varias opciones. Si una de ellas coincide, el patrón será cierto.
Ejemplos:
“aleman(ia|es)” coincide con “alemania” y con “alemanes”
“(norte|sur|este|oeste)” coincide con cualquiera de los puntos cardinales.
Agrupadores
Los paréntesis nos sirven para agrupar un subconjunto. Como hemos visto en el ejemplo anterior, nos es útil para definir la alternancia, pero agrupar un subpatrón nos permite trabajar con él como si fuera un único elemento.
Ejemplos:
“(abc)+” coincide con “abc“, “abcabc“, “abcabcabc“, etc
“ca(sca)?da” coincide con “cascada” y con “cada”
Escapar caracteres
Si por ejemplo quisiéramos que en el patrón hubiese un punto, o un símbolo asterisco, sin que se interprete como metacaracter, tendremos que “escaparlo”. Esto se hace poniendo una barra invertida justo antes: \. o \*
Esto puede hacerse con cualquier caracter que quieras introducir de forma literal, y no interpretada.
Las funciones
Una vez tenemos clara la sintaxis, nos pondremos manos a la obra con el código. En este caso usaremos las funciones que nos proporciona PHP, aúnque la sintaxis es común a muchos lenguajes.
Funciones tipo POSIX
Existen seis funciones de este tipo, que son las siguientes:
- ereg(). Devuelve true si se cumple el patrón, o false si no se cumple.
- eregi(). Igual que ereg(), pero sin distinguir mayúsculas y minúsculas
- ereg_replace(). Usando la potencia de las expresiones regulares, permite modificar una cadena de texto.
- eregi_replace(). Igual que la anterior, sin distinguir minúsculas y mayúsculas.
- split(). Divide una cadena en un array, según un patrón REGEX. Hace la misma tarea que la función explode, pero indicando una expresión regular como separador.
- spliti(). Igual que el anterior, sin diferenciar minúscula y mayúscula.
Funciones tipo PCRE
Estas funciones son un poco más complejas, y consecuentemente más potentes. La diferencia más significativa en cuanto a sintaxis es que el patrón deberá estar delimitado por dos caracteres. Usualmente se usan barras ( / ), aunque podemos usar cualquier símbolo, como ( # ), sobretodo en un patrón que contenga barras. Otra diferencia importante son los modificadores.
- preg_match(). Chequea el patrón en una cadena alfanumérica. Devuelve true si coincide, o false en caso contrario. Además captura las coincidencias en un array.
- preg_match_all(). Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrón (no sólo una como es el caso de preg_match)
- preg_replace(). Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza más de una sustitución con una sola función.
- preg_split(). Separa la cadena dada mediante una expresión regular.
- preg_grep(). Busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.
Ejemplos prácticos
A continuación muestro algunos ejemplos de uso de estas funciones:
Uso sencillo de preg_match.
-
<?php
-
// Este código lee la variable $documento (HTML), y encuentra un numero en negrita
-
$documento = ‘<h1>Numero</h1> <p>El numero es <strong>720</strong>, bla bla bla</p>’;
-
$numero = $num[1];
-
-
?>
Uso de la referencia hacia atrás en preg_match_all
-
<?php
-
// El \\2 es un ejemplo de referencia hacia atrás. Este le dice a pcre
-
// que debe buscar el segundo conjunto de paréntesis en la expresión
-
// regular misma, que sería ([\w]+) en este caso. La barra invertida
-
// extra es requerida ya que la cadena se encuentra entre comillas
-
// dobles.
-
$html = "<b>texto en negrilla</b><a href=hola.html>haga clic aquí</a>";
-
-
-
foreach ($coincidencias as $val) {
-
}
-
?>
Simple comprobación con el patrón de IP
-
<?php
-
// Funcion que comprueba si el dato pasado es una IP correcta
-
function ipValida($ip){
-
return false;
-
-
-
foreach($tmp as $sub){
-
$sub = $sub * 1;
-
if($sub<0 || $sub>256) return false;
-
}
-
-
return true;
-
}
-
?>
Referencias
- Expresiones Regulares (Ignside), lectura muy recomendada
- Funcionamiento interno de los RegEx (Inglés), si tienes curiosidad y entiendes inglés.
- Librería de expresiones regulares ya hechas, para no reinventar la rueda.
- Referencia sintaxis de funciones PCRE del manual oficial.
- Referencia Modificadores del manual oficial.
- Expresión Regular en Wikipedia
- Tutorial de Expresiones Regulares en Wikilearning
Categorias: Código, HOWTO/CóMO, PHP |



[...] Barros, me pasa este artículo sencillo y completo con el que podremos dominar las expresiones regulares. Compártelo # « Permitir que solo usuarios invitados [...]
Diciembre
10:20 AoiStar Ha dicho:
if(!eregi(”^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$”, $ip))
10.0.0.0 - Valida
255.255.255.255 - Valida
999.999.999.999 - Valida
if(!preg_match(”/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/”, $ip))
10.0.0.0 - Valida
255.255.255.255 - Valida
999.999.999.999 - No valida
[...] Alex Barros de Boozox ha creado un excelente manual para aprender a utilizar las expresiones regulares en PHP, algo que muchas veces nos da lata. Les recomiendo su lectura. [Acceder] [...]
[...] Barros de Boozox (Blog que les recomendé hace un tiempo) ha escrito un manual excelente para comprender el uso de las expresiones regulares en [...]
Diciembre
17:13 Alex Barros Ha dicho:
Lo que propone AoiStar es un único patrón para validar una ip válida. El patrón es más largo (y complejo) pero no requiere de una segunda parte de chequeo (como en el ejemplo que he puesto).
Siempre he creido que las expresiones regulares tienen gran parte artística. No suele existir un único patrón para cada cosa, depende mucho del ingenio del programador.
Gracias por la aportación, AoiStar.
Diciembre
5:25 Jordi Roca Ha dicho:
Estaría bien que añadieras cómo utilizar las expresiones greedy
[...] Manual completo y sencillo de Expresiones Regulares en PHP [...]
[...] Las expresiones regulares pueden ser extremadamente útiles en el parseo de strings o documentos completos, sin embargo en sea cual sea el lenguaje de programación que trabajemos el aprender a utilizar esto no es muy fácil que digamos, pues bueno en Boozox nos presenta un manual completo para aprender a utilizar expresiones regulares en PHP. [...]
Diciembre
12:52 mamel Ha dicho:
hola, con respecto a li que dijo AioStar no seria mejor:
if(!preg_match(”/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/”, $ip))
o algo asi, soy novato en expresiones regulares. tal vez la sintaxis no sea muy correcta.
saludos
Diciembre
13:46 Alex Barros Ha dicho:
No sabría decir cuál es más correcta, es dificil desentrañar las expresiones regulares para compararlas.
De todas formas, es lo que he dicho antes: Hay miles de formas distintas de afrontar un mismo patrón. Todo depende del ingenio (y de la suerte, un poco).
Lo único que puedo asegurarte es que te sobra un paréntesis de apertura al principio, pero el resto sí que podría funcionar.
[...] a usar las expresiones regulares con Alex Barros. vía: anieto2k. Etiquetas: [...]
[...] Boozox » Manual completo y sencillo de Expresiones Regulares en PHP (tags: php regex manual) [...]
Febrero
15:24 Marcelo Ha dicho:
Gracias! Al fin encuentro este tema bien explicado y con ejemplos en español.

[...] Barros do site Boozox.net escreveu um simples manual mas muito completo para aqueles que queiram aprender Expressões Regulares e [...]
Abril
9:54 Luis Ha dicho:
MUY BUENOooooooo!!!!!!!!!
os felicito!