Remplazo con preg_replace en PHP

preg_replace en PHP con ejemplo

En este post te mostraré cómo usar preg_replace en PHP a través de un ejemplo. También vamos a ver la sintaxis de la función.

A grandes rasgos, la función preg_replace sirve para remplazar texto en una cadena usando una expresión regular. Lo interesante aquí es que también podemos capturar algunos grupos que coincidan con la expresión regular.

preg_replace en PHP

La sintaxis de la función es la siguiente:

$texto_remplazado = preg_replace($patrón, $sutitución, $texto);

En donde:

  • patrón: es la expresión regular
  • sustitución: por lo que se remplaza cuando se encuentra la expresión regular
  • texto: el texto original, en donde se buscará el patrón y se remplazará con la sustitución

La función devuelve el texto remplazado. Si no hay remplazos, devuelve el texto original.

Nota importante: el patrón debe estar delimitado, recomiendo hacerlo con /.

Un ejemplo simple

Veamos un simple y sencillo ejemplo en donde vamos a remplazar números de teléfono separados por guión bajo, por un guión.

Es decir, convertir algo como 555_1213_555 en algo como 555-1213-555

La expresión regular queda así:

([0-9]+)_

Ya que queremos capturar uno o más números que tengan delante de ellos un guión bajo. Los paréntesis son para capturar cada grupo de números.

Con PHP queda así:

<?php
$texto = "Aunque aquí hay un guión bajo, no se debería remplazar: _
Ni este otro: luis_cabrera_benito
Pero lo siguiente, sí:
555_1213_555
000_123_512
Y esto, no:
123-456-789";
$patron = "/([0-9]+)_/";
# Aquí, $1 representa el primer grupo capturado, que sería el grupo de números
$sustitucion = "$1-";
$textoRemplazado = preg_replace($patron, $sustitucion, $texto);
printf("Antes:\n%s\nDespués:\n%s", $texto, $textoRemplazado);

En la línea 9 tenemos a la expresión regular, delimitada por / como lo mencioné anteriormente. El remplazo se hace en la línea 12 según el remplazo de la línea 11 en donde usamos la variable $1.

La salida es como se ve a continuación:

Remplazo con preg_replace en PHP
Remplazo con preg_replace en PHP

Se ha realizado el remplazo, cosa que no habríamos conseguido con un remplazo sin expresión regular debido a que, si había otros guiones bajos, se iban a remplazar.

Usar preg_replace en PHP con expresiones más complejas

Veamos un segundo ejemplo de preg_replace en PHP. Ahora voy a poner algo que realmente me pasó. En mi blog, para colocar código, utilizaba un plugin que traía los gists. Quise hacerlo con un script de manera nativa, así que había que convertir algo como:

https://gist.github.com/parzibyte/5965689f686ff8c4fa152b34652f3fc1

En algo como:

<script src="https://gist.github.com/parzibyte/5965689f686ff8c4fa152b34652f3fc1.js"></script>

Como se puede notar, necesitaba extraer la cadena o hash del gist y agregarle un .js además de encerrarlo en las etiquetas. Quedó así:

<?php
$texto = '<h3>Veamos un ejemplo</h3>
Y ahora veamos otro ejemplo:
Así se termina este post :)'; $patron = '/https:\/\/gist\.github\.com\/parzibyte\/([a-z0-9]+)/m'; $sustitucion = '<script src="https://gist.github.com/parzibyte/$1.js"></script>'; $textoConRemplazo = preg_replace($patron, $sustitucion, $texto); printf("Original:\n%s\nRemplazado:\n%s", $texto, $textoConRemplazo);

Con el siguiente resultado:

Segundo ejemplo de expresiones regulares y preg_replace en PHP
Segundo ejemplo de expresiones regulares y preg_replace en PHP

Bonus

Como estaba usando WordPress y mi versión de MySQL no soporta la función para remplazar con expresión regular, opté por hacer un script de PHP que consultara cada post (usando PDO), remplazara el contenido y lo guardara.

El código es el siguiente:

<?php

function convertir_contenido($contenido)
{
    $patron = '/(?!.*script src=")https:\/\/gist\.github\.com\/parzibyte\/([a-z0-9]+)/m';
    $sustitucion = '<script src="https://gist.github.com/parzibyte/$1.js"></script>';
    $contenidoRemplazado = preg_replace($patron, $sustitucion, $contenido);
    return $contenidoRemplazado;
}
# Remplazar por tus credenciales y base de datos
$usuario = "parzibyte";
$pwd = "hunter";

$db = new PDO("mysql:host=localhost;dbname=base_de_datos", $usuario, $pwd);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "select id,guid, post_title,post_content from wp_posts where
        post_type='post'
        and post_status='publish'
        and post_content like '%https://gist.github.com/parzibyte/%'
and post_content not like '%<script src=\"https://gist.github.com/parzibyte/%.js\"></script>%'
limit 100;";
$sentencia = $db->query($query);
$sentenciaUpdate = $db->prepare("UPDATE wp_posts SET post_content = ? WHERE id = ?");
$posts = $sentencia->fetchAll(PDO::FETCH_OBJ);
$db->beginTransaction();
foreach ($posts as $post) {
    printf("\nRemplazando %s cuyo id es %s... ", $post->post_title, $post->id);
    $contenido = $post->post_content;
#       echo "\n==================Antes:\n$contenido";
    #       echo $contenido;
    $id = $post->id;
    $contenidoRemplazado = convertir_contenido($contenido);
#       echo "\n==================Después:\n$contenidoRemplazado";
    $ok = 1;
    $ok = $sentenciaUpdate->execute([$contenidoRemplazado, $id]);
    if ($ok) {
        echo "OK";
    } else {
        echo "ERROR";
    }

}
$db->commit();
echo "\nTerminado\n";

Los comentarios y lo malo del código lo he dejado ahí al propósito pues quise que se quedara tal y como lo usé.

Conclusión

Dejo un enlace a la documentación oficial aunque en lo personal no me ayudó mucho.

Por cierto, mis expresiones regulares las pruebo con regex101.

Te dejo un enlace para aprender más sobre PHP.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *