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:
- PHP preg_match(): Compara cadenas mediante expresiones regulares.
- PHP str_replace(): Realiza sustituciones de caracteres y cadenas sin usar expresiones regulares.
- PHP wordwrap(): Ajustar cadenas a un número de caracteres.
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:
1 |
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():
1 2 |
$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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
- Línea 3: en $cadena_origen almaceno los direntes enlaces que vamos a tratar.
- 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.
- Línea 14: busco que la palabra contenga una @.
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//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.