Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PHP (http://www.forosdelweb.com/f18/)
-   -   Expresiones regulares (ayudita) (http://www.forosdelweb.com/f18/expresiones-regulares-ayudita-528818/)

Italico76 27/10/2007 06:31

Expresiones regulares (ayudita)
 
AMIGOS: todo lo que trato me cuesta un parto sin experiencia y el manejo de expresiones regulares no es la excepcion :neurotico

Tengo unos enlaces (cientos) que tengo que parsear y estan en este formato:

Cita:

<li><a href="http://anyveggie.blogspot.com" title="series de TV">Cualquier verdura</a> - series de TV, discos o &quot;cualquier verdura&quot;</li>
<li><a href='http://dientedelparnaso.blogspot.com/' >Diente del Parnaso</a> - un blog sobre noticias de actualidad nacional e internacional con un estilo cr&iacute;tico
<li><a href='http://www.exprofeso.com' title="periodismo">Ex profeso</a> - este es un sitio web de periodismo. el fin: elaborar un discurso crítico de calidad. el medio: la reflexión. la consigna: pensar es hacer periodismo, y hacer periodismo es hacer pensar.</li>
<li><a href="http://www.espacioblog.com/labana/blog" title="periodismo hispano">Mara Torres : página no oficial</a> - Weblog sobre la periodista y escritora Mara Torres. Para ponerse al día sobre su segundo libro, su etapa en La 2 Noticias, y leer una entrevista en exclusiva</li>
<li><a href="http://www.norbertoportugheiz.blogspot.com/" title="actualidad">Norberto Portugheiz</a> - informaciones y referencias de actualidad, respecto a personas y pueblos donde se leeran escritos mios, muchos ineditos: articulos, ensayos, poesia, narrativa, humor. </li>
<li><a href="http://www.otexto.net">Ojo al Texto</a> - bitácora del Prof. Alvaro Ramirez Ospina sobre sociedad, politica, comunicacion,... </li>
<li><a href='http://papearte.blogspot.com' >PapeArt</a> - Noticias, entretenimiento y humor</li>
<li><a href="http://quieroserjedi.blogspot.com/">Quiero ser un jedi </a>- videos, TV, música, chistes, ... </li>
Empecé a hacer algo para intentar parsearlo.... pero NI SIQUIERA pude separarlos teniendo en cuanta que estan flanqueados entre <li> y </li> :'(

Código PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Parserseo de enlaces</title>
</head>

<body>
  
      
<div align="center">
<form method="post" action="anal.php">
<textarea name="entrada" cols="45" rows="5"></textarea>
      <p/>      
      <input type="submit" value="Enviar"/>
</form>
  </div>
  <?php procesa(); ?>  
  </body>
</html>

<?php

Function procesa(){
if (isset(
$_POST["entrada"])) {
$enlaces $_POST["entrada"];
  
//$urls = spliti("<li>",$enlaces);  # prueba con spliti
  
eregi("(<li>)(.*)(</li>)",$enlaces,$urls); # separa  todo lo que este ente <li> </li>  
  
Print_r ($urls);  
  Print 
count($urls);
  }
}
?>


Ideas ?

wigglyUtrera 27/10/2007 09:13

Re: Expresiones regulares (ayudita)
 
Utiliza preg_match_all en vez de eregi

Aqui tienes informacion de cómo utilziar la función:

http://es.php.net/manual/es/function.preg-match-all.php

despues haz un print_r($coincidencias) y puedes ver todo lo que ha encajado.


Saludos

Italico76 27/10/2007 11:10

Re: Expresiones regulares (ayudita)
 
Hola! wigglyUrera: muchas gracias! me da no se que no poder lograrlo con POSIX y tener que recurrir a PCRE.

Es que POSIX no sirve ?:

Raulmmmm 27/10/2007 13:29

Re: Expresiones regulares (ayudita)
 
¿Quieres quitarle los li o qué quieres?
Aquí tienes un ejemplo:
http://raulmmmm.blogspot.com/2007/10...es-en-php.html

Italico76 27/10/2007 14:28

Re: Expresiones regulares (ayudita)
 
Raulmmmm y amigos: lo que quiero es poder extraer el ANCHOR, TITLE y lo que sigue de "DESCRIPCION" de cada link (es lo que queda entre </a> y <li> del siguiente)

Es que manualmente me tipie 600 enlaces para un directorio y ahora quiero absorverlo con PHP y meterlo en una base de datos. Razonable, verdad ?

Lo que mas quisiera en el mundo es ENTENDER porque fallo lo que he escrito y la sintaxis del ejemplo que me dio wigglyUtrera que parece muy complejo!

He visto el codigo de Raulmmmmmmmmmmm y no logro entenderlo por completo (sobre todo eso de $2) pero me pregunto si hace lo que quiero y si INDEPENDIENTEMENTE de eso....... alguien puede explicarme un poquito de como se hace porque veo codigos pero debo entenderlos

Gracias a Raul y wigglyUtrera a todos los que me ayudan :)

Italico76 27/10/2007 17:17

Re: Expresiones regulares (ayudita)
 
A ver.... nadie me puede ayudar ???? :neurotico

Ya explique lo que queria hacer y si yo supiera expresiones regulares (tengo 2 dias de PHP) creo que no seria tan complicado.

Nadie ?

Seppo 27/10/2007 21:12

Re: Expresiones regulares (ayudita)
 
Las expresiones regulares no so mi fuerte, pero esto es lo que pude hacer...

Código PHP:

<?php
$text 
= <<<text
<li><a href="http://anyveggie.blogspot.com" title="series de TV">Cualquier verdura</a> - series de TV, discos o &quot;cualquier verdura&quot;</li>
<li><a href='http://dientedelparnaso.blogspot.com/' >Diente del Parnaso</a> - un blog sobre noticias de actualidad nacional e internacional con un estilo cr&iacute;tico
<li><a href='http://www.exprofeso.com' title="periodismo">Ex profeso</a> - este es un sitio web de periodismo. el fin: elaborar un discurso crítico de calidad. el medio: la reflexión. la consigna: pensar es hacer periodismo, y hacer periodismo es hacer pensar.</li>
<li><a href="http://www.espacioblog.com/labana/blog" title="periodismo hispano">Mara Torres : página no oficial</a> - Weblog sobre la periodista y escritora Mara Torres. Para ponerse al día sobre su segundo libro, su etapa en La 2 Noticias, y leer una entrevista en exclusiva</li>
<li><a href="http://www.norbertoportugheiz.blogspot.com/" title="actualidad">Norberto Portugheiz</a> - informaciones y referencias de actualidad, respecto a personas y pueblos donde se leeran escritos mios, muchos ineditos: articulos, ensayos, poesia, narrativa, humor. </li>
<li><a href="http://www.otexto.net">Ojo al Texto</a> - bitácora del Prof. Alvaro Ramirez Ospina sobre sociedad, politica, comunicacion,... </li>
<li><a href='http://papearte.blogspot.com' >PapeArt</a> - Noticias, entretenimiento y humor</li>
<li><a href="http://quieroserjedi.blogspot.com/">Quiero ser un jedi </a>- videos, TV, música, chistes, ... </li>
text;
preg_match_all('#<li><a href=["|\'](.+)["|\'](.*?)>(.+)</a>(.+)[</li>]?#i'$text$subpatterns);
foreach (
array_keys($subpatterns[0]) as $row) {
    
$title 0;
    
$data[] = array(
        
'url' => preg_replace('#[\'|"] title=[\'|"].*#i',''$subpatterns[1][$row], -1$title),
        
'title' => $title preg_replace('#.*title=[\'|"]#'''$subpatterns[1][$row]) : '',
        
'nombre' => $subpatterns[3][$row],
        
'descripcion' => trim($subpatterns[4][$row]),
    );
}
var_dump($data);
?>


Raulmmmm 28/10/2007 03:45

Re: Expresiones regulares (ayudita)
 
Aquí lo tienes. Ten en cuenta que los href tienen que tener dos comillas, y todo tiene que estar bien cerrado. La variable $href contiene lo que hay dentro de <a href="esto">, la variable $textodentroa contiene lo que hay dentro del a, es decir <a>esto</a>, la variable $textodespuesa contiene lo que hay entre </a> y </li>, y la variable $title contiene lo que hay después del href del a, es decir <a href="" esto></a>.
Código PHP:

<?php
$texto 
'<li><a href="http://anyveggie.blogspot.com" title="series de TV">Cualquier verdura</a> - series de TV, discos o &quot;cualquier verdura&quot;</li>
<li><a href="http://dientedelparnaso.blogspot.com/" >Diente del Parnaso</a> - un blog sobre noticias de actualidad nacional e internacional con un estilo cr&iacute;tico</li>
<li><a href="http://www.exprofeso.com" title="periodismo">Ex profeso</a> - este es un sitio web de periodismo.z</li>
<li><a href="http://www.espacioblog.com/labana/blog" title="periodismo hispano">Mara Torres : página no oficial</a> - Weblog sobre la periodista y escritora Mara Torres. Para ponerse al día sobre su segundo libro, su etapa en La 2 Noticias, y leer una entrevista en exclusiva</li>
<li><a href="http://www.norbertoportugheiz.blogspot.com/" title="actualidad">Norberto Portugheiz</a> - informaciones y referencias de actualidad, respecto a personas y pueblos donde se leeran escritos mios, muchos ineditos: articulos, ensayos, poesia, narrativa, humor. </li>
<li><a href="http://www.otexto.net">Ojo al Texto</a> - bitácora del Prof. Alvaro Ramirez Ospina sobre sociedad, politica, comunicacion,... </li>
<li><a href="http://papearte.blogspot.com" >PapeArt</a> - Noticias, entretenimiento y humor</li>
<li><a href="http://quieroserjedi.blogspot.com/">Quiero ser un jedi </a>a</li>'
;
$a = array("/\<li\>\<a href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>(.*?)\<\/li\>/is");
$b = array("$1"."<br />");
$href preg_replace($a$b$texto);
echo 
$href;
$c = array("$3"."<br />");
$textodentroa preg_replace($a$c$texto);
echo 
$textodentroa;
$d = array("$4"."<br />");
$textodespuesa preg_replace($a$d$texto);
echo 
$textodespuesa;
$e = array("$2"."<br />");
$title preg_replace($a$e$texto);
echo 
$title;
?>


Italico76 28/10/2007 04:56

Re: Expresiones regulares (ayudita)
 
Seppo y Raulmmmm: sin palabras! muchiiiiiiiiiisimas gracias!!!!!!!!!!!!!! :borracho:

Italico76 29/10/2007 10:50

Re: Expresiones regulares (ayudita)
 
Hola! estube estudiando los codigos de Seppo y Raulmmmm y me quedaron algunas cosas en el tintero (que no entendi del todo)

preg_match_all('#<li><a href=["|\'](.+)["|\'](.*?)>(.+)</a>(.+)[</li>]?#i', $text, $subpatterns);
foreach (array_keys($subpatterns[0]) as $row)

Ahi no entiendo lo que esta en negrita del codigo e igualmente con el de Raulmmm:

$a = array("/\<li\>\<a href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>(.*?)\<\/li\>/is");

Para que ese /is del final ? me pueden ayudar ? :si:

Seppo 29/10/2007 11:00

Re: Expresiones regulares (ayudita)
 
Las / que usó raulmmm, o los # que usé yo están para el mismo motivo, que es delimitar la expresión regular. Podés usar cualquier caracter. El más normal es /, peor yo usé # porque es un caracter que seguramente no aparezca en la expresión, mientras que / sí.

El caracter "i" despues del delimitador del patron indica una busqueda insensible a mayusculas/minusculas.

Para la "s": Si se define éste modificador, un meta-caracter de punto en el patrón coincidirá con todos los caracteres, incluyendo el de nueva línea. Sin él, los saltos de línea son excluídos. Este modificador es equivalente a /s en Perl. Una clase negativa como [^a] siempre coincide con un caracter de nueva línea, independientemente del uso de este modificador.

Los modificadores los podés ver acá

Italico76 29/10/2007 11:20

Re: Expresiones regulares (ayudita)
 
Seppo: muchisimas gracias!!! :arriba: se nota que vos y Raulmmmm saben mucho :si:

Como me gustan mucho los blogs de Uds. los he incluido en mi paginita web para acordarme de visitarles :-)

Con su ayuda voy a hacer algo mucho mejor :si:
// gracias de nuevo!!!!!!!! :arriba:

Italico76 31/10/2007 14:09

Re: Expresiones regulares (ayudita)
 
Voy a completar el codigo de Raulmmm con lo que aprendi :si:

Código PHP:

<?php

$texto 
'<li><a href="http://anyveggie.blogspot.com" title ="series de TV">Cualquier verdura</a> - series de TV, discos o &quot;cualquier verdura&quot;</li>
<li><a href="http://dientedelparnaso.blogspot.com/" >Diente del Parnaso</a> - un blog sobre noticias de actualidad nacional e internacional con un estilo cr&iacute;tico</li>
<li><a href="http://www.exprofeso.com" title="periodismo">Ex profeso</a> - este es un sitio web de periodismo.z</li>
<li><a href="http://www.espacioblog.com/labana/blog" title="periodismo hispano">Mara Torres : página no oficial</a> - Weblog sobre la periodista y escritora Mara Torres. Para ponerse al día sobre su segundo libro, su etapa en La 2 Noticias, y leer una entrevista en exclusiva</li>
<li><a href="http://www.norbertoportugheiz.blogspot.com/" title="actualidad">Norberto Portugheiz</a> - informaciones y referencias de actualidad, respecto a personas y pueblos donde se leeran escritos mios, muchos ineditos: articulos, ensayos, poesia, narrativa, humor. </li>
<li><a href="http://www.otexto.net">Ojo al Texto</a> - bitácora del Prof. Alvaro Ramirez Ospina sobre sociedad, politica, comunicacion,... </li>
<li><a href="http://papearte.blogspot.com" >PapeArt</a> - Noticias, entretenimiento y humor</li>
<li><a href="http://quieroserjedi.blogspot.com/">Quiero ser un jedi </a>a</li>'
;

$texto =str_replace("\"" "'" ,$texto);  //reemplazo comillas dobles [ chr(34) ] por simples
 
 
$a = array("/\<li\>\<a href=\'(.*?)\'(.*?)\>(.*?)\<\/a\>(.*?)\<\/li\>/is");

// HREF
$b = array("$1"."<br />");  // los <br/> son esteticos
$href preg_replace($a$b$texto);
//echo $href;

//ANCHOR
$c = array("$3"."<br />");
$textodentroa preg_replace($a$c$texto);
//echo $textodentroa;

//DESCRIPCION ENTRE </a> y <li>
$d = array("$4"."<br />");
$textodespuesa preg_replace($a$d$texto);
//echo $textodespuesa;

//TITLE="......"
$e = array("$2"."<br />");
$title preg_replace($a$e$texto);

//TITLE ( limpio)
$a=array("#title[[:blank:]]*?=[[:blank:]]*?\'(.*?)\'#");
$b = array("$1");
$title_solved preg_replace($a$b$title);
echo 
$title_solved;
  

?>

La parte nueva es

Código PHP:

//TITLE ( limpio)
$a=array("#title[[:blank:]]*?=[[:blank:]]*?\'(.*?)\'#");
$b = array("$1");
$title_solved preg_replace($a$b$title);
echo 
$title_solved

con eso quito lo que molesta y limpio el TITLE :borracho:

Italico76 31/10/2007 14:39

Al pastear debo usar stripslashes() y queda OK
 
El codigo original (donde los enlaces son PASTEADOS desde una FORM) funciona SOLO si utilizo la funcion stripslashes () para pre-procesar la entrada y eliminar los \'

Aqui la VERSION DEFINITIVA: :si:


Código PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Parserseo de enlaces</title>
</head>

<body>
  
      
<div align="center">
<form method="post" action="anal-def.php">
<textarea name="entrada" cols="45" rows="5"></textarea>
      <p/>      
      <input type="submit" value="Enviar"/>
</form>
  </div>
  <?php procesa(); ?>  
  </body>
</html>

<?php

Function procesa(){

if (isset(
$_POST["entrada"])) {

$enlaces $_POST["entrada"];  // tomo de la veriable "entrada" del Form
$enlaces stripslashes ($enlaces); // elimino \'    <<<<<
$texto =str_replace("\"" "'" ,$enlaces);  //reemplazo comillas dobles [ chr(34) ] por simples

$a = array("/\<li\>\<a href=\'(.*?)\'(.*?)\>(.*?)\<\/a\>(.*?)\<\/li\>/is");

// HREF
$b = array("$1"."<br />");  // los <br/> son esteticos
$href preg_replace($a$b$texto);
//echo $href;

//ANCHOR
$c = array("$3"."<br />");
$textodentroa preg_replace($a$c$texto);
//echo $textodentroa;

//DESCRIPCION ENTRE </a> y <li>
$d = array("$4"."<br />");
$textodespuesa preg_replace($a$d$texto);
//echo $textodespuesa;

//TITLE="......"
$e = array("$2"."<br />");
$title preg_replace($a$e$texto);

//TITLE ( limpio)
$a=array("#title[[:blank:]]*?=[[:blank:]]*?\'(.*?)\'#");
$b = array("$1");
$title_solved preg_replace($a$b$title);
echo 
$title_solved;

  
  
//Print_r ($urls);  
  //Print count($urls);
 
}
}
?>

:borracho: :arriba:

Raulmmmm 01/11/2007 04:08

Re: Expresiones regulares (ayudita)
 
¡Me alegro de que te saliera bien! Todos hemos tenido alguna vez problemas con las expresiones regulares, incluso yo.


La zona horaria es GMT -6. Ahora son las 10:14.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.