PHP preg_replace(): Sustituir caracteres y cadenas con expresiones regulares

La función PHP preg_replace() sustituye caracteres y cadenas en una cadena de texto tras una búsqueda realizada mediante expresiones regulares.

Es muy últil a la hora de quitar o eliminar espacios en blanco, acentos, caracteres especiales, saltos de línea y para crear URLs amigables.

Otras funciones de PHP similares son:

La definición oficial es la siguiente:

Realiza una búsqueda y sustitución de una expresión regular

Sintaxis de preg_replace()

Veamos la sintaxis extráida de su web oficial:

preg_replace ( exp_regular, cadena_nueva , cadena[, limite = -1 [, contador ]] )

El valor devuelto por la función depende de la cadena enviada, si se envía un array el resultado será un array, en caso contrario devuelve un string.

  • exp_regular (Obligatorio): Patrón o expresión regular de la búsqueda.
  • cadena_nueva (Obligatorio): Es el nuevo valor que se reemplazará en la $cadena.
  • cadena (Obligatorio): String o array donde queremos hacer la sustitución.
  • limite (Opcional): Número máximo de sustituciones a realizar, por defecto ‘-1’ indica que no hay límite de sustituciones.
  • contador (Opcional): Devuelve el número de sustituciones realizadas.

Ejemplo de la función PHP preg_replace()

Os pongo un secillo ejemplo de preg_replace():

$cadena = 'uno dos 34 tres cuatro cinco seis siete ocho 89 nueve diez';
echo  preg_replace('/[0-9]{2}/', 'SUSTITUIDO', $cadena);

Os explico el código:

  • Creo una cadena con varias palabras.
  • Muestro por pantalla con la función echo la misma cadena pero sustituyendo las palabras que sean numéricas y con 2 caracteres de longitud.

Ejemplo de la función PHP preg_replace() para detectar enlaces en una cadena de texto

En este ejemplo he reutilizado el mismo código que usé en el post sobre cómo detectar links en una cadena de texto:

echo '<h3>Cadena original sin filtrar:</h3>';
//cadena origen con los enlaces sin detectar
$cadena_origen= 'https://www.anerbarrena.com https://www.facebook.com www.google.es @anerbarrena #anerbarrena';
 
echo $cadena_origen;
 
//filtro los enlaces normales
$cadena_resultante= preg_replace("/((http|https|www)[^\s]+)/", '<a href="$1">$0</a>', $cadena_origen);
//miro si hay enlaces con solamente www, si es así le añado el http://
$cadena_resultante= preg_replace("/href=\"www/", 'href="http://www', $cadena_resultante);
echo '<h3>Cadena filtrada con enlaces normales:</h3>'.$cadena_resultante;
 
//saco los enlaces de twitter
$cadena_resultante = preg_replace("/(@[^\s]+)/", '<a target=\"_blank\"  href="http://twitter.com/intent/user?screen_name=$1">$0</a>', $cadena_resultante);
$cadena_resultante = preg_replace("/(#[^\s]+)/", '<a target=\"_blank\"  href="http://twitter.com/search?q=$1">$0</a>', $cadena_resultante);
echo '<h3>Cadena filtrada con enlaces de Twitter:</h3>'.$cadena_resultante;

Detallo cada Línea:

  1. Línea 3: en $cadena_origen almaceno los direntes enlaces que vamos a tratar.
  2. Líneas 8 y 10: detecto que la cadena tenga http, https o www, si encuentro este patrón entiendo que es una url y formo el enlace.
  3. Línea 14: busco que la palabra contenga una @.
  4. Línea 15: busco que la palabra contenga una #.

Ejemplo de la función PHP preg_replace() realizar sustituciones usando arrays

Ahora vamos con un último ejemplo de sustitución ayudándonos con un array:

//cadena con numeros del 1 al 10 en texto
$cadena = 'uno dos tres cuatro cinco seis siete ocho nueve diez';
//cargo en el array los textos a sustituir
$exp_regular = array();
$exp_regular[0] = '/uno/';
$exp_regular[1] = '/tres/';
$exp_regular[2] = '/cinco/';
$exp_regular[3] = '/siete/';
$exp_regular[4] = '/nueve/';
//cargo en el array los textos que pondremos en la sustitucion
$cadena_nueva = array();
$cadena_nueva[0] = '1';
$cadena_nueva[1] = '3';
$cadena_nueva[2] = '5';
$cadena_nueva[3] = '7';
$cadena_nueva[4] = '9';
//saco el resultado por pantalla
echo preg_replace($exp_regular, $cadena_nueva, $cadena);

Explico el ejemplo:

  • Cargamos en la $cadena los números del 1 al 10 en texto
  • Posteriormente en el array $exp_regular vamos cargando los textos que queremos buscar para sustituir.
  • En el array $cadena_nueva ponemos el valor que queremos sustituir.
  • Saco por pantalla con echo el resultado de la sustitución.

Ejemplo de la función PHP preg_replace() con límite y contador de sustituciones

Vamos a ver un último ejemplo para ver el funcionamiento del $limite y el $contador:

//cadena con numeros del 1 al 10 en texto
$cadena = 'uno dos tres cuatro cinco seis siete ocho nueve diez';
//cargo en el array los textos a sustituir
$exp_regular = array();
$exp_regular[0] = '/uno/';
$exp_regular[1] = '/tres/';
$exp_regular[2] = '/cinco/';
$exp_regular[3] = '/siete/';
$exp_regular[4] = '/nueve/';
//cargo en el array los textos que pondremos en la sustitucion
$cadena_nueva = array();
$cadena_nueva[0] = '1';
$cadena_nueva[1] = '3';
$cadena_nueva[2] = '5';
$cadena_nueva[3] = '7';
$cadena_nueva[4] = '9';
//saco el resultado por pantalla
preg_replace($exp_regular, $cadena_nueva, $cadena, -1 , $cuenta );
echo $cuenta;

Aprovechando el ejemplo anterior:

  • A preg_replace() les pasamos adicionalmente el límite de sustituiones ‘-1’, este valor indica que no hay límite.
  • También le pasamos la variable $cuenta para almacenar las sustituciones.
compartir
Publicado por
Aner Barrena