Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

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 en preg_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 luego count($matches[0]).
TOP