(PHP 4, PHP 5, PHP 7, PHP 8)
preg_replace — Buscar y reemplazar mediante expresión regular estándar
$pattern
,$replacement
,$subject
,$limit
= -1,&$count
= null
Analiza subject
para encontrar la expresión
regular pattern
y reemplaza los
resultados por replacement
.
Para hacer coincidir una cadena exacta, en lugar de una expresión regular, se recomienda el uso de str_replace() o str_ireplace() en lugar de esta función.
pattern
El patrón a buscar. Puede ser una cadena o un array de cadenas.
También están disponibles varios modificadores PCRE.
replacement
La cadena o un array de cadenas para el reemplazo.
Si este parámetro es una cadena y el parámetro pattern
es un array, todos los patrones serán reemplazados por esta cadena.
Si los parámetros pattern
y
replacement
son arrays, cada
pattern
será reemplazado por su
replacement
asociado.
Si replacement
tiene menos elementos
que pattern
, entonces una cadena vacía es
utilizada para el resto de los valores.
replacement
puede contener referencias
de la forma \n
o
$n
.
Esta última forma es recomendada. Estas referencias serán reemplazadas
por el texto capturado por la n-ésima parentesis
capturante del patrón. n puede tomar valores de
0 a 99, y \0
o $0
, corresponden al texto que
satisface el patrón completo. Los paréntesis abiertos son contados de izquierda a derecha (empezando por 1) para
determinar el número de paréntesis capturante.
Es de notar que en los chaîne de caractères literales los antislashs deben
ser escapados.
Cuando se trabaja con un patrón de reemplazo donde una referencia hacia atrás
es seguida directamente por un número (i.e.: colocar un número literal inmediatamente
después de una referencia hacia atrás), no se puede usar la sintaxis clásica
\1
para la referencia hacia atrás. \11
, por ejemplo,
será confuso para la función preg_replace() en el sentido de que
no sabrá si se desea la referencia hacia atrás \1
seguida del número
1
o si se desea la referencia hacia atrás \11
seguida de "nada". En este caso, la solución es usar la sintaxis ${1}1
.
Esto creará una referencia hacia atrás aislada $1
, seguida del número
literal 1
.
Cuando se usa la opción obsoleta e
, esta función
escapa algunos caracteres ('
, "
,
\
y NULL) en la cadena que reemplaza las referencias hacia atrás.
Este comportamiento se justifica para asegurar que no ocurra ningún error de sintaxis
al usar las referencias hacia atrás con comillas simples y dobles (e.g. 'strlen(\'$1\')+strlen("$2")'
).
Asegúrese de estar familiarizado con la sintaxis
de las cadenas para saber exactamente a qué debe parecerse la cadena interpretada.
subject
La cadena o el array que contiene las cadenas a buscar y reemplazar.
Si subject
es un array, entonces la operación
será aplicada a cada uno de los elementos del array, y el array será devuelto.
Si el array subject
es asociativo, entonces las claves
serán preservadas en el valor devuelto.
limit
El número máximo de reemplazos para cada patrón en
cada cadena subject
. Por omisión, vale
-1
(sin límite).
count
Si se proporciona, esta variable contendrá el número de reemplazos realizados.
preg_replace() devuelve un array si el parámetro
subject
es un array, o una cadena en caso contrario.
Si se encuentran coincidencias, el nuevo
subject
será devuelto, de lo contrario
subject
será devuelto sin cambios, o null
si ocurre un error.
Utilizar la opción "\e" es un error; se emite una E_WARNING
en este caso.
If the regex pattern passed does not compile to a valid regex, an E_WARNING
is emitted.
Ejemplo #1 Uso de referencias hacia atrás con literales numéricos
<?php
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>
El resultado del ejemplo sería:
April1,2003
Ejemplo #2 Uso de arrays indexados con preg_replace()
<?php
$string = 'Le renard marron agile saute par dessus le chien paresseux.';
$patterns = array();
$patterns[0] = '/agile/';
$patterns[1] = '/marron/';
$patterns[2] = '/renard/';
$replacements = array();
$replacements[2] = 'grizzly';
$replacements[1] = 'brun';
$replacements[0] = 'lent';
echo preg_replace($patterns, $replacements, $string);
?>
El resultado del ejemplo sería:
Le lent brun grizzly saute par dessus le chien paresseux.
Ordenando los patrones y los reemplazos, se debería obtener el resultado esperado.
<?php
$string = 'Le renard marron agile saute par dessus le chien paresseux.';
$patterns = array();
$patterns[0] = '/agile/';
$patterns[1] = '/marron/';
$patterns[2] = '/renard/';
$replacements = array();
$replacements[2] = 'grizzly';
$replacements[1] = 'brun';
$replacements[0] = 'lent';
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>
El resultado del ejemplo sería:
Le grizzly brun lent saute par dessus le chien paresseux.
Ejemplo #3 Reemplazo de múltiples valores simultáneamente
<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>
El resultado del ejemplo sería:
$startDate = 5/27/1999
Ejemplo #4 Eliminación de espacios
Este ejemplo elimina los espacios en exceso en una cadena.
<?php
$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// Mostrará 'foo o'
echo $str;
?>
Ejemplo #5 Uso del parámetro count
<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo $count; //3
?>
El resultado del ejemplo sería:
xp***to 3
Nota:
Cuando se usan arrays con los parámetros
pattern
yreplacement
, las claves son tratadas en el orden en que aparecen en el array. Esto no es necesariamente lo mismo que el orden de los índices numéricos. Si se usan índices para identificar quépattern
debe ser reemplazado por quéreplacement
, se recomienda hacer un ordenamiento ksort() en cada array antes de llamar a preg_replace().
Nota:
Cuando
pattern
yreplacement
son arrays, las reglas de coincidencia funcionarán de manera secuencial. Es decir, la segunda parejapattern
/replacement
operará sobre la cadena de caracteres que resulta de la primera parejapattern
/replacement
, y no sobre la cadena original. Si se desea simular reemplazos funcionando en paralelo, como el intercambio de dos valores, reemplace un patrón por un sustituto intermedio, luego en una pareja posterior, reemplace este marcador intermedio por el reemplazo deseado.<?php
$p = array('/a/', '/b/', '/c/');
$r = array('b', 'c', 'd');
print_r(preg_replace($p, $r, 'a'));
// imprime d
?>