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:
preg_match_all($patron, $string, $salida, ($opciones));
?>
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:
$cadena = '18/01-85 26/01/92';
preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_PATTERN_ORDER);
//Este script nos sirve para sacar las fechas y saber qué separador usan.
echo $salida[0][0] . " y " . $salida[0][1];
echo "
";
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:
$cadena = '18/01-85 26/01/92';
preg_match_all('/[0-9]{2}(\/|\-)[0-9]{2}(\/|\-)[0-9]{2}/', $cadena, $salida, PREG_SET_ORDER);
//Solo cambia el patrón y lo de abajo
echo $salida[0][0] . " y " . $salida[1][0];
echo "
";
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:
preg_match_all($patron, $string)
?>
Usaremos un ejemplo para explicar su funcionamiento:
$cadena = '135hola842';
echo preg_match('/hola/', $cadena);
?>
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:
preg_replace($patron, $sustitucion, $cadena)
?>
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.
$cadena = 'Enero 26, 1992';
$patron = '/(\w+) (\d+), (\d+)/i';
$sustitucion = 'Nací el $2 de $1 de $3';
echo preg_replace($patron, $sustitucion, $cadena);
?>
Devuelve: Nací el 26 de Enero de 1992
Hola tengo una pregunta:
Para que se usa el arroba en esa expresion? Cuando hay que usarla?
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:
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.
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.
Me alegro mucho que te guste =)
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))