Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Auton en 18 Junio 2011, 11:31 am



Título: Detectar Links y meter en un array
Publicado por: Auton en 18 Junio 2011, 11:31 am
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


Título: Re: Detectar Links y meter en un array
Publicado por: madpitbull_99 en 18 Junio 2011, 12:05 pm
Escribí un post que te puede ayudar: Parsear HTML con PHP – Simple HTML DOM Parser (http://foro.elhacker.net/empty-t328391.0.html).

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


Título: Re: Detectar Links y meter en un array
Publicado por: Auton en 18 Junio 2011, 13:11 pm
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

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


Título: Re: Detectar Links y meter en un array
Publicado por: madpitbull_99 en 18 Junio 2011, 14:18 pm
Mira esta función que sirve para extraer el contenido situado entre dos delimitadores:

Código
  1. <?php
  2.  
  3.    /**
  4.      * Devuelve el contenido situado entre dos delimitadores.
  5.      *
  6.      * @return string
  7.      */
  8.    function getContentFromDelimiters($string, $start, $end) {
  9.        $pos = stripos($string, $start);
  10.        $str = substr($string, $pos);
  11.        $str_two = substr($str, strlen($start));
  12.        $second_pos = stripos($str_two, $end);
  13.        $str_three = substr($str_two, 0, $second_pos);
  14.        $unit = trim($str_three);
  15.        return $unit;
  16.    }
  17.  
  18.    /**
  19.      * Funcionamiento y Uso
  20.      */
  21.  
  22.    $handler = fopen ("http://madhacking.com", r);
  23.    if ($handler)
  24.        echo "[Ok] Access to site.<br />";
  25.    while (!feof($handler)) {
  26.        $webData .= fread($handler, 12000);
  27.    }
  28.    //var_dump($webData);
  29.    fclose($handler);
  30.  
  31.    $webTitle = getContentFromDelimiters($webData, "<title>", "</title>");
  32.    echo "<b>The web title is: </b>".$webTitle;
  33. ?>


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.


Título: Re: Detectar Links y meter en un array
Publicado por: Auton en 19 Junio 2011, 19:51 pm
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é


Título: Re: Detectar Links y meter en un array
Publicado por: Shell Root en 19 Junio 2011, 20:36 pm
Te puede servir de apoyo ;)
http://shellrootsecurity.blogspot.com/2010/06/simulacion-de-la-tool-list-urlspy-en_1763.html


Título: Re: Detectar Links y meter en un array
Publicado por: Auton en 21 Junio 2011, 09:38 am
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


Título: Re: Detectar Links y meter en un array
Publicado por: Shell Root en 21 Junio 2011, 15:49 pm
Lo que pasa es que esto se realiza por medio de la consola y por el paso de argumentos tal como,
Código
  1. $ php list-urls.php [URL]


Título: Re: Detectar Links y meter en un array
Publicado por: Auton en 24 Junio 2011, 12:01 pm
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.

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');
       $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


Título: Re: Detectar Links y meter en un array
Publicado por: WHK en 25 Junio 2011, 08:19 am
Sin librerías:

Código
  1. <?php
  2.  
  3. $buffer = file_get_contents('http://foro.elhacker.net/');
  4. $links = explode('<a', $buffer);
  5. array_shift($links);
  6. foreach($links as $id => $link){
  7. $lnk = explode('href="', $link);
  8. $lnk = explode('"', $lnk[1]);
  9. $lnk = $lnk[0];
  10. $text = explode('>', $link);
  11. $text = explode('<', $text[1]);
  12. $text = $text[0];
  13. if(substr(trim($text), 0, 1) == '<')
  14. $type = 'object';
  15. elseif(!trim($text))
  16. $type = 'bad link';
  17. else
  18. $type = 'text';
  19.  
  20. $ob_links[] = array(
  21. 'id' => ($id + 1),
  22. 'link' => $lnk,
  23. 'text' => $text,
  24. 'type' => $type
  25. );
  26. }
  27.  
  28. print_r($ob_links);
  29.  
  30. ?>


Título: Re: Detectar Links y meter en un array
Publicado por: Nakp en 25 Junio 2011, 10:52 am
yo pienso que esto hace el trabajo :¬¬

Código
  1. $pat = '/<a.+href=[\"\']([a-z\/:\.\%\-\_0-9\s]+)[\"\']/i';
  2. preg_match_all($pat, $data, $urls);
  3. var_dump($urls[1]);



pa quien quiera probar
http://regex.larsolavtorvik.com/

le agregue el espacio porque hay gente que le da la gana escribirlos en vez de %20 xD


Título: Re: Detectar Links y meter en un array
Publicado por: ~ Yoya ~ en 25 Junio 2011, 17:16 pm
Si, vivan las expresiones regulares xD. Muy buena la pagina Nakp, usaba otra pero era en Flash.

Código
  1. <?php
  2. $contenido = file_get_contents('http://foro.elhacker.net/');
  3.  
  4. preg_match_all('/<a[^=]+=(?:\"|\')((?i).+(?-i))(?:\"|\')>(.+)<\/a>/',$contenido, $result, PREG_SET_ORDER);
  5.  
  6. print_r($result);
  7. ?>

Salida:
Código:
[87] => Array
        (
            [0] => <a href="http://foro.elhacker.net/profiles/azielito-u5350.html">Azielito</a>
            [1] => http://foro.elhacker.net/profiles/azielito-u5350.html
            [2] => Azielito
        )

    [88] => Array
        (
            [0] => <a href="http://foro.elhacker.net/multimedia-b3.0/">Multimedia</a>
            [1] => http://foro.elhacker.net/multimedia-b3.0/
            [2] => Multimedia
        )


Saludos.