Funciones de PHP para Regex
Funciones PCRE para trabajar con regex: preg_match()
, preg_match_all()
,
preg_replace()
, preg_split()
, y preg_grep()
.
También mencionaremos brevemente las funciones POSIX obsoletas.
Funciones PCRE
PHP usa el estándar PCRE (Perl-Compatible Regular Expressions), más potente y flexible que las funciones POSIX obsoletas
(ereg
, eregi
, etc.).
preg_match()
Busca una coincidencia del patrón en la cadena. Devuelve 1
si hay coincidencia, 0
si no, o
false
si hay error.
<?php
declare(strict_types=1);
$texto = "El ala aleve del leve abanico";
$patron = "/ale/";
// Coincide: "ale" (en "aleve").
// No coincide: "al", "ele".
preg_match($patron, $texto, $coincidencias);
// $coincidencias[0] contiene "ale".
?>
preg_match_all()
Encuentra todas las coincidencias y las almacena en un array.
<?php
declare(strict_types=1);
$texto = "el ala aleve del leve abanico";
$patron = "/\w+/"; // Palabras
// Coincide: "el", "ala", "aleve", "del", "leve", "abanico".
// No coincide: Espacios o caracteres no alfanuméricos.
preg_match_all($patron, $texto, $coincidencias);
// $coincidencias[0] contiene ["el", "ala", "aleve", "del", "leve", "abanico"].
?>
preg_replace()
Busca y reemplaza coincidencias del patrón.
<?php
declare(strict_types=1);
$texto = "el ala aleve del leve abanico";
$patron = "/al/";
// Coincide: "al" (en "ala", "aleve").
// No coincide: "a" o "l" solos.
$string = preg_replace($patron, "<b>AL</b>", $texto);
echo "$string\n"; // el <b>AL</b>a <b>AL</b>eve del leve abanico
?>
preg_split()
Divide una cadena en un array usando un patrón como delimitador.
<?php
declare(strict_types=1);
$texto = "24-09-2003";
$patron = "/[-\/.]/"; // Guion, barra o punto
// Coincide: "-", "/", ".".
// No coincide: Otros caracteres.
$partes = preg_split($patron, $texto);
// $partes contiene ["24", "09", "2003"].
?>
preg_grep()
Filtra un array, devolviendo elementos que coincidan con el patrón.
<?php
declare(strict_types=1);
$palabras = ["sol", "luna", "estrella", "cielo"];
$patron = "/^s/"; // Empieza por "s"
// Coincide: "sol"
// No coincide: "luna", "cielo" "estrella"
$filtradas = preg_grep($patron, $palabras);
// $filtradas contiene ["sol"].
?>
Seguridad
- Sanitización: Escapa patrones de usuario con
preg_quote()
:
<?php
declare(strict_types=1);
$entrada = filter_input(INPUT_POST, "patron", FILTER_SANITIZE_STRING) ?? "";
$patron = "/" . preg_quote($entrada, "/") . "/";
// Coincide: La entrada sanitizada como literal.
// No coincide: Entradas maliciosas no escapadas.
preg_match($patron, "Prueba segura");
?>
- Límite: Usa el parámetro
limit
enpreg_replace()
para evitar bucles infinitos.
preg_match() vs preg_match_all()
Las funciones preg_match()
y preg_match_all()
permiten buscar patrones dentro de una cadena usando expresiones regulares. Aunque su sintaxis es parecida, su comportamiento es diferente.
preg_match()
Devuelve solo la primera coincidencia encontrada.
<?php
$texto = "El ala aleve del leve abanico";
$patron = "/el/i"; // i = case insensitive
preg_match($patron, $texto, $matches);
var_dump($matches);
?>
Resultado:
array(1) {
[0]=>
string(2) "El"
}
preg_match_all()
Devuelve todas las coincidencias que encuentre en el texto.
<?php
$texto = "El ala aleve del leve abanico";
$patron = "/el/i";
preg_match_all($patron, $texto, $matches);
var_dump($matches);
?>
Resultado:
array(1) {
[0]=>
array(3) {
[0]=> string(2) "El"
[1]=> string(2) "el"
[2]=> string(2) "el"
}
}
Comparativa
Función | ¿Cuántas coincidencias? | ¿Modifica $matches? | Uso típico |
---|---|---|---|
preg_match() |
Primera coincidencia | Sí, guarda la primera | Comprobación simple: ¿existe el patrón? |
preg_match_all() |
Todas las coincidencias | Sí, guarda un array de coincidencias | Contar, listar o extraer varias apariciones |
Notas adicionales
- Ambas funciones aceptan modificadores como
i
(insensible a mayúsculas),u
(Unicode),m
(modo multilínea), etc. - Para contar apariciones sin extraerlas, puedes usar
preg_match_all()
y luegocount($matches[0])
.