Foros del Web » Programando para Internet » PHP »

Expresiones regulares (ayudita)

Estas en el tema de Expresiones regulares (ayudita) en el foro de PHP en Foros del Web. AMIGOS: todo lo que trato me cuesta un parto sin experiencia y el manejo de expresiones regulares no es la excepcion Tengo unos enlaces (cientos) ...
  #1 (permalink)  
Antiguo 27/10/2007, 06:31
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Busqueda Expresiones regulares (ayudita)

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

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 ?
  #2 (permalink)  
Antiguo 27/10/2007, 09:13
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 4 meses
Puntos: 3
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
  #3 (permalink)  
Antiguo 27/10/2007, 11:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
De acuerdo 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 ?:
  #4 (permalink)  
Antiguo 27/10/2007, 13:29
Avatar de Raulmmmm  
Fecha de Ingreso: marzo-2007
Ubicación: En otro lugar que tú
Mensajes: 1.549
Antigüedad: 17 años, 1 mes
Puntos: 36
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
  #5 (permalink)  
Antiguo 27/10/2007, 14:28
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
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 :)
  #6 (permalink)  
Antiguo 27/10/2007, 17:17
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Re: Expresiones regulares (ayudita)

A ver.... nadie me puede ayudar ????

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

Nadie ?
  #7 (permalink)  
Antiguo 27/10/2007, 21:12
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
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);
?>
  #8 (permalink)  
Antiguo 28/10/2007, 03:45
Avatar de Raulmmmm  
Fecha de Ingreso: marzo-2007
Ubicación: En otro lugar que tú
Mensajes: 1.549
Antigüedad: 17 años, 1 mes
Puntos: 36
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;
?>
  #9 (permalink)  
Antiguo 28/10/2007, 04:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
De acuerdo Re: Expresiones regulares (ayudita)

Seppo y Raulmmmm: sin palabras! muchiiiiiiiiiisimas gracias!!!!!!!!!!!!!!
  #10 (permalink)  
Antiguo 29/10/2007, 10:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
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 ?
  #11 (permalink)  
Antiguo 29/10/2007, 11:00
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
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á
  #12 (permalink)  
Antiguo 29/10/2007, 11:20
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
De acuerdo Re: Expresiones regulares (ayudita)

Seppo: muchisimas gracias!!! se nota que vos y Raulmmmm saben mucho

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
// gracias de nuevo!!!!!!!!

Última edición por Italico76; 29/10/2007 a las 11:40
  #13 (permalink)  
Antiguo 31/10/2007, 14:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
De acuerdo Re: Expresiones regulares (ayudita)

Voy a completar el codigo de Raulmmm con lo que aprendi

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

Última edición por Italico76; 31/10/2007 a las 14:37
  #14 (permalink)  
Antiguo 31/10/2007, 14:39
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
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:


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);
 
}
}
?>

Última edición por Italico76; 31/10/2007 a las 14:52
  #15 (permalink)  
Antiguo 01/11/2007, 04:08
Avatar de Raulmmmm  
Fecha de Ingreso: marzo-2007
Ubicación: En otro lugar que tú
Mensajes: 1.549
Antigüedad: 17 años, 1 mes
Puntos: 36
Re: Expresiones regulares (ayudita)

¡Me alegro de que te saliera bien! Todos hemos tenido alguna vez problemas con las expresiones regulares, incluso yo.
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 11:07.