Foros del Web » Programando para Internet » PHP »

Expresiones regulares y preg_match_all

Estas en el tema de Expresiones regulares y preg_match_all en el foro de PHP en Foros del Web. Saludos, me acabo de inscribir en el foro, y les estoy envando un problema que tengo desde hace un rato, y que no se como ...
  #1 (permalink)  
Antiguo 28/07/2003, 00:36
 
Fecha de Ingreso: julio-2003
Mensajes: 4
Antigüedad: 14 años, 4 meses
Puntos: 0
Expresiones regulares y preg_match_all

Saludos, me acabo de inscribir en el foro, y les estoy envando un problema que tengo desde hace un rato, y que no se como resolver.

He estado modificando una aplicacion que hace busquedas en textos utilizando expresiones regulares en PHP. Vean la siguiente instruccion:

preg_match_all("/<(?:a|area).+?href\s*=\s*(?:\"(.*?)\"|'(.*?)'|(.*? )(?:\s|>))/im",$urlContent,$arr,PREG_SET_ORDER)

La instruccion me devuelve, un arreglo de dos dimensiones con los emparejamientos de la expresion regular con el contenido de '$urlContent', y los links que contienen los hrefs que encuentra. Esta bien que me devuelva los links... por ejemplo:

http://miweb/pagina_inicio/index.html

pero en los hrefs que me devuelve me da cosas de la forma:

<a href="http://miweb/pagina_inicio/index.html"

tal cual como se ve... empieza en el "<a" y termina al final del link. El problema es que necesito cambiar la expresion regular en la llamada a la funcion para que cuando me devuelva el Anchor me lo de completo hasta donde se cierra con </a>, porque nececsito capturar no solo el link real, sino tambien lo que se muestra al usuario para que haga clic ahi. Es decir, el texto mostrado en la pagina para hacer el link. Entonces deberia capturar algo como

<a href="http://miweb/pagina_inicio/index.html">Mi Web</a>

...es decir el Anchor completo.

Muchas gracias y espero que me puedan ayudar. Hasta luego.
  #2 (permalink)  
Antiguo 28/07/2003, 12:33
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola mi amigo, y bienvenido al foro

Respecto a tu consulta, me parece que una modificación de la expresión regular que tienes que podría resultar, sería de esta forma (colocándola en medio de un segmento de código que usa el ejemplo que mencionas):

Código:
<?php

$urlContent = '<a href="http://miweb/pagina_inicio/index.html">Mi Web</a>';

preg_match_all ("/<(?:a|area).+?href\s*=" .
                "\s*(?:\"(.*?)\"|'(.*?)'|(.*?)(?:\s|> )).*?<\s*\\/a\s*>/im",
                $urlContent, $arr, PREG_SET_ORDER);

print "Contenido de \$arr:<br />\n<pre>\n";

var_dump ($arr);

print "</pre>\n";

?>
Hay ciertos detalles en esa expresión regular que me parece que no tienen mucho sentido, o no son demasiado precisos, como por ejemplo el segmento que supongo sirve para encontrar coincidencias de URLs que no se encuentren entre comillas sencillas o dobles: (.*?)(?:\s|> )

En cualquier caso, asumo que esa expresión fue construida de ese modo por alguna buena razón. Espero que el ejemplo anterior te sea útil al menos para guiarte... :)

Un cordial saludo
  #3 (permalink)  
Antiguo 28/07/2003, 17:36
 
Fecha de Ingreso: julio-2003
Mensajes: 4
Antigüedad: 14 años, 4 meses
Puntos: 0
Muchas gracias!

La expresion me devuelve exactamente lo que queria :) .

Este es el primer foro que consigo en que me respondes cosas que realmente me parecen dificiles. En la mayoria de los foros que me he metido nadie me habia respondido cosas como esta.

Bueno... yo tambien estoy a la orden para responder cualqueir cosa que sepa y que pueda ayudar.

Hasta luego desde Venezuela.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:50.