1. Code
  2. Coding Fundamentals
  3. Regular Expressions

Cómo trabajar con expresiones regulares en PHP

Scroll to top

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

En este artículo veremos las funciones de PHP que te permiten usar expresiones regulares para realizar operaciones de búsqueda y reemplazo en cadenas.

¿Qué es una expresión regular?

Las expresiones regulares, también conocidas como "regex", son patrones de búsqueda de texto. Estos patrones pueden ser procesados por un motor de expresiones regulares para encontrar subcadenas, para validar que una cadena coincida con un patrón, o para buscar y reemplazar texto.

Las expresiones regulares son muy poderosas, lo que te permite realizar operaciones de búsqueda y reemplazo en cadenas sin esfuerzo. Se utilizan ampliamente para la comparación y validación de patrones en diferentes idiomas. Hoy vamos a discutir las regex en el contexto de PHP.

En esta publicación analizaremos las diferentes funciones disponibles en PHP que se ocupan de las expresiones regulares. Específicamente, exploraremos las funciones de la familia preg_* junto con ejemplos reales.

Funciones de expresiones regulares en PHP

En esta sección veremos una variedad de funciones de expresiones regulares en PHP con ejemplos reales.

La función preg_match

La función preg_match realiza una comparación con una cadena usando una expresión regular. Echemos un vistazo a la sintaxis:

1
preg_match ( string $pattern , string $subject , array &$matches = null , int $flags = 0 , int $offset = 0 );

El primer argumento es el patrón que quieres buscar. Debes proporcionarlo en formato de expresión regular. El segundo argumento es la cadena objetivo con la que se realiza la comparación con la expresión regular. Luego el tercer argumento es opcional, pero si se proporciona, este se rellenará con los resultados de la búsqueda. En la mayoría de los casos necesitarás estos tres argumentos.

El cuarto argumento es una combinación de las banderas PREG_OFFSET_CAPTURE y PREG_UNMATCHED_AS_NULL que puedes usa para obtener información adicional relacionada con los resultados de la búsqueda.

Finalmente, el quinto argumento es el desplazamiento, que te permite especificar la posición en donde comenzará la búsqueda. Por lo tanto, si no quieres comenzar a buscar desde el principio de la cadena, este es el argumento que deberías usar.

Esa es la sintaxis de la función preg_match. Echemos un vistazo a un par de ejemplos reales.

Ejemplo 1: comparación simple de cadenas

1
<?php
2
preg_match('/tutsplus/i', 'The code.tutsplus.com is one of my favorite websites among the group of all tutsplus websites!', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => tutsplus

8
    )

9
**/
10

En el primer ejemplo, estamos verificando si el texto de origen contiene una palabra específica. Dado que la cadena tutsplus existe en el texto de origen, la variable $matches se rellena con la cadena coincidente.

Ejemplo 2: comparación simple de patrones

1
<?php
2
preg_match('/code.(tutsplus).com/i', 'The code.tutsplus.com is one of my favorite websites among the group of all tutsplus websites!', $matches);
3
/**
4
$matches value:
5
    Array
6
    (
7
        [0] => code.tutsplus.com
8
        [1] => tutsplus
9
    )
10
**/
11

En este ejemplo hemos usado la comparación de patrones. Ya que es una comparación de patrones, el elemento $matches[0] contiene el texto que coincidió con el patrón completo, y el elemento $matches[1] contiene el texto que coincidió con el primer patrón que se encuentra entre paréntesis.

Ejemplo 3: encontrar rutas de imágenes

1
<?php
2
preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', '<img src="https://example.com/image1.jpg" /><img src="https://example.com/image2.jpg" />', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => <img src="http://example.com/image1.jpg

8
        [1] => http://example.com/image1.jpg

9
    )

10
**/
11

A continuación tratamos de encontrar el valor del atributo src en la primera etiqueta <img>. Es importante tener en cuenta que, a pesar de haber múltiples coincidencias, solamente devuelve la primera de ellas.

Ejemplo 4: encontrar etiquetas HTML específicas

1
<?php
2
preg_match('#<div class="tutsplus">(. *?)</div>#s', '<div>Some text.</div><div class="tutsplus">Special text.</div><div>Some more text.</div>', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => <div class="tutsplus">Special text.</div>

8
        [1] => Special text.

9
    )

10
**/

Finalmente, este es un ejemplo que demuestra cómo extraer texto del interior de las etiquetas HTML específicas.

La función preg_match_all

La función preg_match_all es muy similar a la función preg_match, con la excepción de que realiza una comparación global con una expresión regular. Y, por lo tanto, devuelve todos los valores que coinciden con el patrón.

Además, la sintaxis de la función preg_match_all es la misma que la de la función preg_match.

Revisemos rápidamente un par de ejemplos para ver cómo funciona. De hecho, vamos a analizar los ejemplos que hemos discutido en la sección anterior, pero usaremos la función preg_match_all en lugar de la función preg_match. Hacer el análisis de esta manera debería ayudarte a comprender la diferencia entre estas dos variantes.

Ejemplo 1: comparación simple de cadenas

1
<?php
2
preg_match_all('/tutsplus/i', 'The code.tutsplus.com is one of my favorite websites among the group of all tutsplus websites!', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => Array

8
            (

9
                [0] => tutsplus

10
                [1] => tutsplus

11
            )

12


13
    )

14
**/

Ejemplo 2: comparación simple de patrones

1
<?php
2
3
preg_match_all('/code.(tutsplus).com/i', 'The code.tutsplus.com is one of my favorite websites among the group of all tutsplus websites!', $matches);
4
/**

5
$matches value:

6
    Array

7
    (

8
        [0] => Array

9
            (

10
                [0] => code.tutsplus.com

11
            )

12


13
        [1] => Array

14
            (

15
                [0] => tutsplus

16
            )

17


18
    )

19
**/

Ejemplo 3: encontrar rutas de imágenes

1
<?php
2
preg_match_all('/< *img[^>]*src *= *["\']?([^"\']*)/i', '<img src="http://example.com/image1.jpg" /><img src="http://example.com/image2.jpg" />', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => Array

8
            (

9
                [0] => <img src="http://example.com/image1.jpg

10
                [1] => <img src="http://example.com/image2.jpg

11
            )

12


13
        [1] => Array

14
            (

15
                [0] => http://example.com/image1.jpg

16
                [1] => http://example.com/image2.jpg

17
            )

18


19
    )

20
**/

Ejemplo 4: encontrar etiquetas HTML específicas

1
<?php
2
preg_match_all('#<div class="tutsplus">(.*?)</div>#s', '<div>Some text.</div><div class="tutsplus">Special text.</div><div>Some more text.</div><div class="tutsplus">More special text.</div>', $matches);
3
/**

4
$matches value:

5
    Array

6
    (

7
        [0] => Array

8
            (

9
                [0] => <div class="tutsplus">Special text.</div>

10
                [1] => <div class="tutsplus">More special text.</div>

11
            )

12


13
        [1] => Array

14
            (

15
                [0] => Special text.

16
                [1] => More special text.

17
            )

18


19
    )

20
**/

Es importante tomar en cuenta que, cuando usas la función preg_match_all, la variable $matches se inicializa con una matriz multidimensional. El elemento $matches[0] se inicializa con una matriz de todos los valores que coinciden con el patrón completo. Por otro lado, el elemento $matches[1] se inicializa con una matriz de valores que coinciden con el primer subpatrón que se encuentra entre paréntesis, el elemento $matches[2] contiene una matriz de valores que coinciden con el segundo subpatrón que se encuentra entre paréntesis, y así sucesivamente.

La función preg_match_all es muy potente, y te encontrarás con ella a menudo durante tu desarrollo cotidiano en PHP.

La función preg_replace

La función preg_replace realiza una búsqueda de expresiones regulares y te permite reemplazar los resultados de la búsqueda con otras cadenas. Veamos su formato:

1
preg_replace ( string|array $pattern , string|array $replacement , string|array $subject , int $limit = -1 , int &$count = null );

El primer argumento es el patrón que quieres buscar. Puede ser una cadena o una matriz de cadenas. En el segundo argumento puedes enviar una cadena o una matriz de cadenas para reemplazarlo. Es importante tomar en cuenta que, si proporcionas el parámetro $replacement como una cadena, y el parámetro $pattern contiene una matriz, todos los patrones coincidentes serán reemplazados con la cadena $replacement. Por otro lado, si proporcionas tanto $pattern como $replacement como una matriz, esta será una operación de búsqueda y reemplazo uno a uno.

El tercer argumento es una cadena o una matriz de cadenas para buscar y reemplazar. Continuando, el cuarto argumento te permite especificar el número máximo de reemplazos que quieres realizar para cada patrón. Finalmente, el último argumento te permite enviar una variable que se rellenará con el número de reemplazos realizados.

Ahora echemos un vistazo a un par de ejemplos.

Ejemplo 1: reemplazo simple de cadenas

1
<?php
2
$sourceString = "Let's fix the spelling of Tutplus in this sentence. The Tutplus is a great resource for online learning!";
3
echo preg_replace('/Tutplus/i', 'tutsplus', $sourceString);
4
/**

5
OUTPUT:

6
Let's fix the spelling of tutsplus in this sentence. The tutsplus is a great resource for online learning!

7
**/

En este ejemplo, solamente estamos reemplazando una sola palabra dondequiera que aparezca en el texto.

Ejemplo 2: reemplazo con una matriz

1
<?php
2
$sourceString = "This text contains shortcodes like {LOGO}, {HOMEPAGE_URL} and {CONTACT_EMAIL}. It should be replaced with the actual content before it's rendered.";
3
echo preg_replace(
4
    array('/{LOGO}/i', '/{HOMEPAGE_URL}/i', '/{CONTACT_EMAIL}/i'),
5
    array('<img src="http://example.com/logo.png"', 'http://example.com', 'admin@example.com'),
6
    $sourceString
7
);
8
/**

9
OUTPUT:

10
This text contains shortcodes like <img src="http://example.com/logo.png", http://example.com and admin@example.com. It should be replaced with the actual content before it's rendered.

11
**/

En este ejemplo tenemos una lista de patrones para comparar y una lista de contenido con el que vamos a reemplazar cada uno de ellos. Esto es similar a la manera en la que funcionan los shortcodes en WordPress.

Ejemplo 3: conversión de direcciones URL relativas a direcciones URL absolutas

1
<?php
2
$sourceString = '<p>Some text here.</p><p><img src="images/logo.jpg" /></p><p><img src="images/logo2.jpg" /></p><p>More text here.</p>';
3
4
$pattern = '/<img(\s+)src="images\//i';
5
$replace = '<img src="http://example.com/images/';
6
echo preg_replace($pattern, $replace, $sourceString);
7
/**

8
OUTPUT:

9
<p>Some text here.</p><p><img src="http://example.com/images/logo.jpg" /></p><p><img src="http://example.com/images/logo2.jpg" /></p><p>More text here.</p>

10
**/

En este ejemplo estamos reemplazando direcciones URL relativas de imágenes con direcciones URL absolutas. Observa que esto es un poco simplista; esta no pretende ser una demostración real de cómo reescribir direcciones URL relativas como direcciones URL absolutas.

Ejemplo 4: reemplazo con referencias

1
<?php
2
$sourceString = '<div>Some text.</div><div class="tutsplus">Special text.</div><div>Some more text.</div>';
3
4
$pattern = '#<div class="tutsplus">(.*?)</div>#s';
5
$replace = '<b>$1</b>';
6
echo preg_replace($pattern, $replace, $sourceString);
7
/**

8
OUTPUT:

9
<div>Some text.</div><b>Special text.</b><div>Some more text.</div>

10
**/

En este último ejemplo hemos usado la referencia $1 en la variable $replace, que hace referencia al texto capturado por el primer patrón que se encuentra entre paréntesis. De esta manera también puedes usar el texto capturado en la cadena de reemplazo.

Mientras hablamos sobre la función preg_replace, también debes saber que existe otra función, preg_filter, que funciona de la misma manera que preg_replace, con la excepción de que solamente devuelve cadenas objetivo que coincidan con el patrón.

La función preg_grep

La función preg_grep te permite realizar comparaciones de patrones con una matriz de valores.

La sintaxis de la función preg_grep se ve así:

1
preg_grep ( string $pattern , array $array , int $flags = 0 );

El primer argumento es el patrón que quieras buscar, y el segundo argumento es la matriz de entrada.

La función preg_grep es realmente útil cuando tienes una matriz de elementos y deseas extraer aquellos que tengan un patrón específico.

Analicemos rápidamente el siguiente ejemplo.

1
<?php
2
$arrWebsites = [
3
  "code.tutsplus.com",
4
  "example.com",
5
  "someotherdomain.com",
6
  "webdesign.tutsplus.com",
7
  "business.tutsplus.com"
8
];
9
10
$result = preg_grep("/(.*)[.]tutsplus[.](.*)/i", $arrWebsites);
11
print_r($result);
12
/**

13
OUTPUT:

14
Array

15
(

16
    [0] => code.tutsplus.com

17
    [3] => webdesign.tutsplus.com

18
    [4] => business.tutsplus.com

19
)

20
**/
21
?>

En el ejemplo anterior hemos usado la función preg_grep para filtrar sitios web que pertenecen al grupo tutsplus.

La función preg_replace_callback

La función preg_replace_callback es casi idéntica a la función preg_replace, con la excepción de que, en el segundo argumento, necesitas especificar una función de devolución de llamada en lugar de la cadena de reemplazo.

Convirtamos uno de los ejemplos de preg_replace que hemos discutido anteriormente usando la contraparte preg_replace_callback.

1
<?php
2
$sourceString = '<div>Some text.</div><div class="tutsplus">Special text.</div><div>Some more text.</div>';
3
4
$pattern = '#<div class="tutsplus">(.*?)</div>#s';
5
echo preg_replace_callback($pattern, function ($matches) {return '<b>' . $matches[1] . '</b>';}, $sourceString);
6
/** 

7
OUTPUT:

8
<div>Some text.</div><b>Special text.</b><div>Some more text.</div>

9
**/
10
?>

Como puedes ver, hemos proporcionado una función anónima como segundo argumento de la función preg_replace_callback. Esta recibiría los elementos de texto capturados en la matriz $matches, y puedes usarla para realizar reemplazos.

La función preg_split

La función preg_split te permite dividir una cadena en base a una expresión regular.

Echemos un vistazo a la sintaxis de la función preg_split.

1
preg_split ( string $pattern , string $subject , int $limit = -1 , int $flags = 0 );

El primer argumento es el patrón que quieres buscar, mientras que el segundo argumento es la cadena de entrada.

Echemos un vistazo al siguiente ejemplo para comprender cómo funciona.

1
<?php
2
$sourceString = "This is a long text.

3
It contains a lot of line breaks.

4
Let's split it with the preg_split function.";
5
$result = preg_split ("/\\n/", $sourceString);
6
print_r($result);
7
/**

8
OUTPUT:

9
Array

10
(

11
    [0] => This is a long text.

12
    [1] => It contains a lot of line breaks.

13
    [2] => Let's split it with the preg_split function.

14
)

15
**/
16
?>

Aquí puedes ver que estamos usando un patrón que coincide con los saltos de línea, y la salida devuelve las líneas individuales del texto.

Conclusión

Hoy hemos hablado sobre las funciones de expresiones regulares en PHP. Exploramos una variedad de funciones de la familia preg_* junto con ejemplos reales para comprender cómo funcionan.