Explicación de preg_match_all, preg_match y preg_replace

preg_match_all nos sirve para cuando queremos buscar algo en una cadena de texto, y queremos que nos devuelva eso que ha encontrado. Nos podría servir por ejemplo, para saber todas las imágenes que hay en una página web o sencillamente, para recoger fechas y cosas definidas desconocidas.

Sentencia:

Patron serán los filtros que pongamos para que busque dentro del string. Este patrón se expresa con expresiones regulares.
String es la cadena de texto en donde vamos a buscar lo que necesitamos.
Salida será la matriz final en la que tengamos los resultados de la búsqueda y algunos otros resultados.
Opciones será el parámetro que nos permita ordenar en el array de salida los elementos obtenidos (son opcionales). Por ejemplo:

";
echo $salida[1][0] . " y " . $salida[1][1];
echo "
"; echo $salida[2][0] . " y " . $salida[2][1]; ?>

Nos devuelve:

18/01-85 y 26/01/92
/ y /
– y /

El siguiente ejemplo:

";
echo $salida[0][1] . " y " . $salida[1][1];
echo "
"; echo $salida[0][2] . " y " . $salida[1][2]; ?>

Devuelve:
18/01-85 y 26/01/92
/ y /
– y /


preg_match lo usaremos para saber simplemente, si en una cadena de texto se encuentra lo que buscamos. Si hemos entendido preg_match_all, con este no deberia de haber ningún problema. Usa una sentencia igual (en los dos primeros parámetros) que preg_match_all:

Usaremos un ejemplo para explicar su funcionamiento:

Nos devuelve 1, porque lo ha encontrado. Si no lo hubiera encontrado nos habria devuelto 0.


preg_replace nos permite, a partir de una cadena dada, reemplazar, reordenar y cambiar datos de esta cadena de forma sencilla.
Su sentencia es:

Patrón se expresa mediante Expresiones Regulares.
Sustitución es la cadena ordenada y reorganizada a la que dará resultado. Usaremos $N en donde N serán números indicadores de la posición de los patrones, por los que sustituiremos (con el ejemplo se ve mucho más fácil).
Cadena es la cadena de texto a la que realizaremos la edición.

Devuelve: Nací el 26 de Enero de 1992

6 Replies to “Explicación de preg_match_all, preg_match y preg_replace”

  1. Hola tengo una pregunta:

    < ?
     preg_match('@^(?:http://)?([^/]+)@i',
        "http://www.php.net/index.html", $coincidencias);
    ?>
    

    Para que se usa el arroba en esa expresion? Cuando hay que usarla?

    1. El arroba en esa expresión realmente no significa nada, me explico:
      He visto que la función la has recogido de la página de php.net, cuya función entera es la siguiente:

      < ?
      preg_match('@^(?:http://)?([^/]+)@i',
          "http://www.php.net/index.html", $matches);
      $host = $matches[1];
      echo $host; //Para ver la salida, que nos muestra: www.php.net
      ?>
      

      Ahí, el arroba simplemente lo usan como separador, porque para usar expresiones regulares ya complejas hacen falta “aislarlas”. Fíjate en el ejemplo del preg_replace que puse: http://delanover.com/2010/07/27/explicacion-de-preg_match_all-preg_match-y-preg_replace-php/#preg_replace Si te fijas, empiezo y acabo el patrón con una barra / (aunque luego pongo la i al final).

      No sé porqué aquí usan este caracter para aislar la función, porque he probado a poner la barra / y me da error, igual porque contradice algo escrito, sin embargo, prueba a escribir la función cambiando los arroba por #, o por | y verás como también funciona, puesto que también nos pueden servir para “aislar” la expresión regular. Simplemente sirven para eso, no hacen ninguna función.

      Saludos, lipman.

  2. Saludos lipman, tengo tiempo tambien estudiando php, postgresql, ccs y en los actuales momentos estoy de lleno investigando a través de tutoriales de php POO. Son muy interesantes estos tutoriales y he aprendido un mundo.

  3. Hola tengo un problema con pre_match, yo creo que es por la extensión de la cadena que quiero analizar son 1000 caracteres, al usar cadenas grandes grandes me muestra el error:
    Error 103 (net::ERR_CONNECTION_ABORTED)
    pero si uso cadenas mas pequeñas si realiza bien la comprobación.
    ¿Existe alguna manera de resolver eso aparte de segmentar el origen de los datos?
    esta es la expresion:
    if(preg_match(“@^(\n)*(^>)((\w)+(\|)?)+(\w)(\s)*((\w)*(\s)*)+$@”,$te))

Leave a Reply

Your email address will not be published. Required fields are marked *