Foros del Web » Programando para Internet » PHP »

¿Cómo hacer esto?

Estas en el tema de ¿Cómo hacer esto? en el foro de PHP en Foros del Web. Hola, me gustaría saber como hacer esto. Tengo una página html, que se compone básicamente de enlaces, de esta forma: <A href="http://www.index1.com">Desc1</A><BR> <A href="http://www.index2.com">Desc2</A><BR> ... ...
  #1 (permalink)  
Antiguo 07/01/2003, 21:22
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 15 años
Puntos: 0
¿Cómo hacer esto?

Hola, me gustaría saber como hacer esto. Tengo una página html, que se compone básicamente de enlaces, de esta forma:

<A href="http://www.index1.com">Desc1</A><BR>
<A href="http://www.index2.com">Desc2</A><BR>
...

Lo que quiero es poder hacer un script en php, q recorra el fichero y coja por un lado la url http://www.index1.com, y por otro lado la desc de esa url.

Había pensado en almacenar los datos en un array bidimensional, pero creo q también se podría crear un archivo txt donde guardar los datos para su posterior manejo.

¿Me pueden echar una ayudita? Gracias!
  #2 (permalink)  
Antiguo 08/01/2003, 07:41
Avatar de joseisrael  
Fecha de Ingreso: noviembre-2002
Ubicación: Maracay, Edo. Aragua
Mensajes: 221
Antigüedad: 15 años
Puntos: 1
A ver

Saludos.

Amigo creo que la mejor manera para lo que quieres hacer es trabajar con MySql.

Teniendo una tabla con todos los enlaces podrías hacer algo así:

Haces la consulta a la DB:

$query = "SELECT * FROM " . TBL_ENLACES . " ORDER BY ENLACE";

Luego Imprimes los resultados:

<table>

<?

for ($i=0; $row = mysql_fetch_row ($query); $i++) {

echo "<tr><td>" . $row[ENLACE] . "</td></tr>";

}

?>

</table>

Donde ENLACE es el nombrer del campo de la tabla TBL_ENLACES. Dicho campo contendrá los enlaces correspondientes.

Suerte.
__________________
Aprender Siempre. Lema de Vida

José Molina
  #3 (permalink)  
Antiguo 08/01/2003, 07:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Quieres tener algo así como un directorio de links .. con los datos:

URL|nombre_link

Si es eso .. guardalo con ese formato mismo en un fichero de texto planto (si así lo quieres):

URL|nombre_link
URL|nombre_link
URL|nombre_link
URL|nombre_link


Es decir .. usando el \n salto de linea como delimitador de registros y el | como delimitador (o cualquier otra cadena/codigo) de campos.

Con esa estructura simple .. usa la función:

fgetcsv()
http://us.php.net/manual/en/function.fgetcsv.php

Con esta funcion lees un fichero de texto plano con la estructura mencionada y lo almacena en un array con los "campos" separados.

Un saludo,
  #4 (permalink)  
Antiguo 08/01/2003, 07:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
joseisrael

Por supuesto que administrar y crear una simple tablita SQL como la del caso es mas sencillo y versatil usando algun motor de base de datos como Mysql .. Pero recuerda que no de base de datos vive el hombre solo ...

Cada proyecto tiene su solución mas acertada ..

En este caso no sé .. tampoco ha dicho si esos datos van a ser modificados frecuentemente o simplemente los quiere tener en un fichero de texto plano fijos para leerlo o separar datos de código ...

Un saludo,
  #5 (permalink)  
Antiguo 08/01/2003, 07:55
Avatar de joseisrael  
Fecha de Ingreso: noviembre-2002
Ubicación: Maracay, Edo. Aragua
Mensajes: 221
Antigüedad: 15 años
Puntos: 1
Exacto

Saludos.

Ciertamente Cluster así es.

La verdad es que estoy acostumbrado a trabajar con las DB, y siempre ando agregando variables a manejar. Por ejemplo, se me ocurre agregar a eso, lo siguiente:

- Secciones: cada link agrupado en una seccion; Nacionales, Internacionales, etc.

- Imagen: cada link asociado a una imagen, para mostrar no solo el URL, sino tambien la imagen respectiva.

- Prioridad: cada link asociado a un campo PRIORIDAD, donde se podrían colcoar que se impriman primero los de mayor prioridad, pudiendo cobrar a los interesados por la PRIORIDAD 1.

En fin, así muchas otras.

Pero claro, eso es porque así trabajo yo.

De todas formas, se que siempre contaremos con varias opiniones en un mismo tema, por eso el exito de estos foros.

Suerte.
__________________
Aprender Siempre. Lema de Vida

José Molina
  #6 (permalink)  
Antiguo 08/01/2003, 08:09
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 15 años
Puntos: 0
Gracias a todos por la ayuda.

Está claro q si necesitase un bdd la usaría, pero al ser únicamente esos dos datos los que me interesan, pienso q un archivo plano será más fácil de manejar por el servidor, sobre todo cuando la lista se vuelva inmensa.

Pero mi principal problema es como extraer de una porción de código html como la q comentaba al principio, por un lado las referencias a los links, y las descripciones. Estoy intentándolo con expresiones regulares, pero me está costando. Si alguien tiene idea ya sabe.

Mil gracias!
  #7 (permalink)  
Antiguo 08/01/2003, 08:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Revisa dentro de las expresiones regulares:

preg_match_all()
http://www.php.net/manual/en/functio...-match-all.php

Justo uno de sus ejemplos es lo q buscas .. "Parsear" un HTML en busca de alguna etiquéta como la de un link HTML q tiene su formato definido.

Código PHP:
$html "<b>bold text</b><a href=howdy.html>click me</a>";

preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/"$html$matches);

for (
$i=0$icount($matches[0]); $i++) { 
 echo 
"matched: ".$matches[0][$i]."\n"
 echo 
"part 1: ".$matches[1][$i]."\n"
 echo 
"part 2: ".$matches[3][$i]."\n"
 echo 
"part 3: ".$matches[4][$i]."\n\n";


Un saludo,
  #8 (permalink)  
Antiguo 08/01/2003, 23:44
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 15 años
Puntos: 0
Lo tengo casi!!!

Bueno chicos, tras unas cuantas horas y unas búsquedas en google he conseguigo montar este código q funciona.

<?php
if (getenv('REQUEST_METHOD') == 'POST') {
$url = $_POST[url];
} else {
$url = $_GET[url];
}
?>

<form action="<?= $PHP_SELF ?>" method="POST">
URL:<input type="text" name="url" value="<?= $url ?>"/>
<input type="submit">
</form>

<?php
$reciproco = "http://loquesea.com";
// Función para comprobar si existe un determinado texto (enlace) en una url
function recip($surl,$reciproco){
$fd = fopen ("$surl", "r");
while (!feof ($fd))
{
$buffer = fgets($fd, 4096);
if (strstr($buffer,$reciproco))
return true;
}
fclose ($fd);
}

//Borramos de un array los elementos que tengan reciproco
function borrar(&$ahrefs,&$alinks,$reciproco){
$x=0;
while($x<sizeof($ahrefs))
{
if (recip($ahrefs[$x],$reciproco) == false){
array_splice($ahrefs,$x,1);
array_splice($alinks,$x,1);}
else
$x++;
}
}

// Separamos el código html (hrefs y links)
if ($url) {
$remote = fopen($url, 'r');
$data = fread($remote, 1048576);
fclose($remote); }

unset($location);
$links = array(); // Array con la descripción de los links
$hrefs = array(); // Array de urls
$pos = 0;
while (!(($pos = strpos($data,"<",$pos)) === false)) {
$pos++;
$endpos = strpos($data,">",$pos);
$tag = substr($data,$pos,$endpos-$pos);
$tag = trim($tag);
if (isset($location)) { // Buscamos </A>
if (!strcasecmp(strtok($tag," "),"/A")) {
$link = substr($data,$linkpos,$pos-1-$linkpos);
$links[] = $link;
$hrefs[] = $location;
unset($location);
}
$pos = $endpos+1;
} else { // Buscamos <A ...>
if (!strcasecmp(strtok($tag," "),"A")) {
if (eregi("HREF[ \t\n\r\v]*=[ \t\n\r\v]*\"([^\"]*)\"",$tag,$regs));
else if (eregi("HREF[ \t\n\r\v]*=[ \t\n\r\v]*([^ \t\n\r\v]*)",$tag,$regs));
else $regs[1] = "";
if ($regs[1]) {
$location = $regs[1];
}
$pos = $endpos+1;
$linkpos = $pos;
} else {
$pos = $endpos+1;
}
}
}
borrar($hrefs,$links,$reciproco);

for ($i=0; $i<sizeof($links); $i++) {
echo "<A HREF=\"".$hrefs[$i]."\">".$links[$i]."</A><BR>\n";
}
?>


Le paso una url con una lista de enlaces y me devuelve una lista con los q tienen el recíproco. Mi problema ahora es q no puedo manejar grandes listas. Si le paso una con más de 30-35 se cuelga. ¿Alguien sabe cómo puedo optimizar el código para conseguir manejar más enlaces?

Gracias a todos por la ayuda!
  #9 (permalink)  
Antiguo 09/01/2003, 04:33
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Hmmm, bueno seria interesante que mandaras tambien el mensaje de error si es que hay alguno. otra opcion seria que te estes acabando el tiempo de ejecucion que es de 30 seg de forma predeterminada. Para quitar ese tiempo en procesos que pueden ser un poco mas largo que eso, puedes usar la funcion time_set_limit(0);

Eso por una parte por otra te aconsejaria que usaras mejor expresiones regulares para reducir la cantidad de codigo que tienes. En un mensaje anterior cluster te paso el dato de la funcion preg_match_all que puedes usar para el proposito que requieres. si no te queda claro aqui te dejo un ejemplo sencillo con fines de educacion ya la "maquillada" y la adaptada del codigo la haces tu.
Por cierto antes de continuar cuando agregues codigo usa el boton PHP para que el codigo quede resaltado.
Código PHP:
$arch_remoto fopen"http://www.forosdelweb.com",'r');
  
  while( !
feof$arch_remoto ) )
  {
     
$cont_arch .= fgets$arch_remoto4096 );
  }
  
fclose$arch_remoto );

  
$patron "/<a href=[^>]+>.+<\/a>/iUS";
  
preg_match_all($patron,$cont_arch,$coin);

  foreach( 
$coin as $link )
  {
    foreach( 
$link as $rlink )
    {
      echo 
$rlink "<br>\n";
    }
  } 
  #10 (permalink)  
Antiguo 09/01/2003, 22:03
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 15 años
Puntos: 0
Gracias Herminio. Con el set_time_limit he conseguido poder resolver el problema de archivos más grandes, pero aún así, no puedo procesar archivos muy grandes (+100 enlaces).

El código q has posteado no me funciona por otra parte. De todas formas gracias a todos por su ayuda.

Ahora necesito acelerar la ejecución del script. Una posibilidad es q en lugar de efectuar 1 conexión con una página, y comprobar su html, pudiera acceder a varias simultaneamente, aunq esto no sé si aumentaría la velocidad o la dejaría igual.

Posteo el código tal como está actualmente.

Código PHP:
<?php 
if (getenv('REQUEST_METHOD') == 'POST') { 
  
$url $_POST[url]; 
  
$reciproco $_POST[reciproco];
} else { 
  
$url $_GET[url]; 
  
$reciproco $_GET[reciproco];

?> 

<form action="<?= $PHP_SELF ?>" method="POST">
  <div align="center">
    <table width="75%" border="0" cellspacing="5" cellpadding="0">
<tr>
        <td width="12%">URL:</td>
        <td width="88%"> <input name="url" type="text" value="<?= $url ?>" size="80"/></td>
      </tr>
      <tr>
        <td>Texto:</td>
        <td><input name="reciproco" type="text" value="<?= $reciproco ?>" size="80"/></td>
      </tr>
    </table>
<input type="submit">
  </div>
</form> 

<?php

  set_time_limit
(0);  
  
// Función para comprobar si existe un determinado texto (enlace) en una url
function recip($surl,$reciproco){
    
$fd fopen ("$surl""r");
    while (!
feof ($fd)) 
    {
        
$buffer fgets($fd4096);
        if (
strstr($buffer,$reciproco))
            return 
true;
    }
    
fclose ($fd);
}

//Borramos de un array los elementos que tengan reciproco
function borrar(&$ahrefs,&$alinks,$reciproco){
    
$x=0;    
    while(
$x<sizeof($ahrefs))
    {
    if (
recip($ahrefs[$x],$reciproco) == true){
        
array_splice($ahrefs,$x,1);
        
array_splice($alinks,$x,1);}
    else
        
$x++; 
    }
}

  
// Separamos el código html (hrefs y links) 
  
if ($url) { 
  
$remote fopen($url'r'); 
  
$data fread($remote1048576); 
  
fclose($remote); }

  unset(
$location); 
  
$links = array();  // Array con la descripción de los links 
  
$hrefs = array();  // Array de urls
  
$pos 0
  while (!((
$pos strpos($data,"<",$pos)) === false)) { 
    
$pos++; 
    
$endpos strpos($data,">",$pos); 
    
$tag substr($data,$pos,$endpos-$pos); 
    
$tag trim($tag); 
    if (isset(
$location)) {  // Buscamos </A> 
      
if (!strcasecmp(strtok($tag," "),"/A")) { 
        
$link substr($data,$linkpos,$pos-1-$linkpos); 
        
$links[] = $link
        
$hrefs[] = $location
        unset(
$location); 
      } 
      
$pos $endpos+1
    } else {  
// Buscamos <A ...> 
      
if (!strcasecmp(strtok($tag," "),"A")) { 
        if (
eregi("HREF[ \t\n\r\v]*=[ \t\n\r\v]*\"([^\"]*)\"",$tag,$regs)); 
        else if (
eregi("HREF[ \t\n\r\v]*=[ \t\n\r\v]*([^ \t\n\r\v]*)",$tag,$regs)); 
        else 
$regs[1] = ""
        if (
$regs[1]) {  
          
$location $regs[1]; 
        } 
        
$pos $endpos+1
        
$linkpos $pos
      } else { 
        
$pos $endpos+1
      } 
    } 
  } 
  
borrar($hrefs,$links,$reciproco);
for (
$i=0$i<sizeof($links); $i++) { 
    echo 
"<A HREF=\"".$hrefs[$i]."\">".$links[$i]."</A><BR>\n"
  } 
?>
Si a alguien se le ocurre algo gracias por adelantado.
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 09:23.