Foros del Web » Programando para Internet » PHP »

Patron para buscar enlaces [regex]

Estas en el tema de Patron para buscar enlaces [regex] en el foro de PHP en Foros del Web. Hola, que tal? Mi problema es el siguiente: Tengo el siguiente pagron para buscar enlaces $patron="/(<a([^>]*)>)(.+)(<\/a( .*)?>)/i"; preg_match_all($patron, $codHTML, $coincidencias, PREG_SET_ORDER); Creia que funcionaba bien, ...
  #1 (permalink)  
Antiguo 02/06/2006, 04:05
 
Fecha de Ingreso: noviembre-2003
Mensajes: 18
Antigüedad: 20 años, 5 meses
Puntos: 0
Patron para buscar enlaces [regex]

Hola, que tal?

Mi problema es el siguiente:

Tengo el siguiente pagron para buscar enlaces

$patron="/(<a([^>]*)>)(.+)(<\/a( .*)?>)/i";
preg_match_all($patron, $codHTML, $coincidencias, PREG_SET_ORDER);

Creia que funcionaba bien, pero al aplicarlo a cierto codigo HTML he detectado un error:

Al aplicarlo a:

Código:
<a hef="htp://ebay.es/sitemap.html">mapa del sitio</a> | <a href="htp://pages.ebay.es/index.html">preguntanos</a>
el resultado es:

Código:
Array
(
    [0] => Array
        (
            [0] => htp://ebay.es/sitemap.html
            [1] => mapa del sitio / |  preguntanos
        )

)

Sim embargo, si hago un intro, despues de la etiqueta ../a> y antes de la siguiente <a ...

Código:
<a hef="ttp://ebay.es/sitemap.html">mapa del sitio</a>
 | <a hef="htp://pages.ebay.es/index.html">preguntanos</a>
ó

Código:
<a href="htp://ebay.es/sitemap.html">mapa del sitio</a> |
 <a hef="htp://pages.ebay.es/index.html">preguntanos</a>
ó

...

pues funciona perfectamente y saca como resultado:

Código:
Array
(
    [0] => Array
        (
            [0] => htp://ebay.es/sitemap.html
            [1] => mapa del sitio
        )

    [1] => Array
        (
            [0] => htp://pages.ebay.es/index.html
            [1] => preguntanos
        )

)
Por mucho que sigo mirando no encuentro porque si dejo un intro si que funciona pero si hay cualquier caracter, no
__________________
www.MadridVsBarsa.es.vg
  #2 (permalink)  
Antiguo 02/06/2006, 12:41
 
Fecha de Ingreso: noviembre-2003
Mensajes: 18
Antigüedad: 20 años, 5 meses
Puntos: 0
El fallo debe estar en el (.+) de:

$patron="/(<a([^>]*)>)(.+)(<\/a( .*)?>)/i";


La cosa es que si en vez de (.+) pongo ([^<]+) para que sea cualquier caracter menos el < que es como empieza el cierre de </a> pues si que lo hace bien..pero claro, si viene algun enlace que tenga en el texto que englobe <a href="">texto<mastexto</a> pues no lo va a tomar como enlace

como se pondria en el patron que fuera cualquier caracter menos el texto "</a>" ?
__________________
www.MadridVsBarsa.es.vg
  #3 (permalink)  
Antiguo 02/06/2006, 13:06
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años
Puntos: 0
Puede que lo necesites sea utilizar el modificador de patrón U.

Eso hace que la función no sea greedy (glotona o ambiciosa) y devuelva la coincidencia más corta que encuentre.

Probá con este patrón, a ver si te sirve:

Código PHP:
$patron="/<a.*<\/a>/iU"
Más info:
http://www.ignside.net/man/php/regex.php
__________________
Guish
  #4 (permalink)  
Antiguo 03/06/2006, 04:29
 
Fecha de Ingreso: noviembre-2003
Mensajes: 18
Antigüedad: 20 años, 5 meses
Puntos: 0
a, pues muchas gracias.

Me ha resuelto el problema.

Ahora casi ya lo hace bien. aunque no me funciona del todo, pero no es debido a eso, si no que uso un parseador htm que cuando en un enlace aparece el caracter < como en el :

<a href="">texto<mastexto</a><a href="pepe">adf</a>

pues lo parsea mal, y lo deja tal que
<a href="">texto<a href="pepe">adf</a></a>


pero eso es inevitable y es "culpa" del parseador (o mejor dicho, del que haga una pagina y no escape el caracter "<")

un sasludo y mucha gracias

Lo he probado pero sigue sin funcionar y eso que en teoria el modificador "U" deberia ser precisamente para eso


Buf...no encuentro la solucion
__________________
www.MadridVsBarsa.es.vg

Última edición por FITIPALDIs; 03/06/2006 a las 06:17
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 02:30.