Detectar Links y meter en un array

Iniciado por Auton, 18 Junio 2011, 11:31 AM

0 Miembros y 1 Visitante están viendo este tema.

Auton

Hola,
por no subir de nuevo un antiguo tema hago la pregunta en uno nuevo.

El tema es este:

http://foro.elhacker.net/php/buscar_links_y_meter_en_un_array-t293080.0.html

y mi pregunta es cómo puedo extraer el texto del link aparte de la url.

Gracias

madpitbull_99

Escribí un post que te puede ayudar: Parsear HTML con PHP – Simple HTML DOM Parser.

Con esa librería se puede hacer fácilmente lo que tú quieres.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

Auton

#2
Hola,
muchas gracias por tu pronta respuesta.
Esa librería y código están realmente bien.
Quizá lo necesite en algún momento pero busco algo que creo que es más sencillo a partir de algo que ya tengo. Con este mismo código

<?
$html = file_get_contents('http://www.example.com');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
       $href = $hrefs->item($i);
       $url = $href->getAttribute('href');
       echo $url.',';
}
?>



ya consigo extraer todas las urls de un html sin librerías en la variable $url, y me imagino que de la misma manera que tenemos la url me imagino que no debe ser muy dificil extraer lo que hay entre: <a href="http://ellink">
y </a> en otra variable, aunque para mí no es tan sencillo claro.
Si no aparece algo recurriré a lo que me dices.
Gracias de nuevo

madpitbull_99

Mira esta función que sirve para extraer el contenido situado entre dos delimitadores:

Código (php, 31) [Seleccionar]
<?php
 
    
/**
     * Devuelve el contenido situado entre dos delimitadores.
     *
     * @return string
     */
    
function getContentFromDelimiters($string$start$end) {
        
$pos stripos($string$start);
        
$str substr($string$pos);
        
$str_two substr($strstrlen($start));
        
$second_pos stripos($str_two$end);
        
$str_three substr($str_two0$second_pos);
        
$unit trim($str_three);
        return 
$unit;
    }
 
    
/**
     * Funcionamiento y Uso
     */
 
    
$handler fopen ("http://madhacking.com"r);
    if (
$handler)
        echo 
"[Ok] Access to site.<br />";
    while (!
feof($handler)) {
        
$webData .= fread($handler12000);
    }
    
//var_dump($webData);
    
fclose($handler);
 
    
$webTitle getContentFromDelimiters($webData"<title>""</title>");
    echo 
"<b>The web title is: </b>".$webTitle;
?>



También viene con un ejemplo de uso. Lo importante está en la línea resaltada.

Supongo que es lo que quieres, mira a ver si te sirve.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

Auton

Muchas gracias,
ahora estoy intentando utilizar esto pero para que encuentre los textos de los enlaces de la página de forma dinámica dentro del bucle de mi código.
Te contaré

Shell Root

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Auton

Hola,
muchas gracias por tu aportación.
Había visto preg_match_all pero no entiendo muy bien que debo hacer con este código.
'argv' ?
No se dónde tendría que poner la url del contenido de donde tengo que extraer los links (con su texto de link).

Muchas gracias

Shell Root

Lo que pasa es que esto se realiza por medio de la consola y por el paso de argumentos tal como,
Código (bash) [Seleccionar]
$ php list-urls.php [URL]
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Auton

#8
Hola!
Ya tengo la solución !
Ante todo gracias por vuestras respuestas.
Aunque la solución era más sencilla.
Partiendo del mismo código que había puesto sólo he tenido que añadir $text = $href->nodeValue; donde la variable $text será el texto del link.


<?
$html = file_get_contents('http://www.example.com');

$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
      $href = $hrefs->item($i);
      $url = $href->getAttribute('href');
      $text = $href->nodeValue;
      echo "<a href='$url'>$text</a>";
}
?>

De hecho ahora lo que me faltaría es detectar una imagen en caso de que en lugar de texto fuese una el cuerpo del enlace.
;D

WHK

Sin librerías:

Código (php) [Seleccionar]
<?php

$buffer 
file_get_contents('http://foro.elhacker.net/');
$links explode('<a'$buffer);
array_shift($links);
foreach(
$links as $id => $link){
$lnk explode('href="'$link);
$lnk explode('"'$lnk[1]);
$lnk $lnk[0];
$text explode('>'$link);
$text explode('<'$text[1]);
$text $text[0];
if(substr(trim($text), 01) == '<')
$type 'object';
elseif(!trim($text))
$type 'bad link';
else
$type 'text';

$ob_links[] = array(
'id' => ($id 1),
'link' => $lnk,
'text' => $text,
'type' => $type
);
}

print_r($ob_links);

?>