2010-01-26 4 views
1

J'essaye d'écrire une petite fonction de PHP qui passerait par une page (fournie une URL) et renverrait le nombre de liens et le nombre de liens qui lient à la même page. Par exemple, si je fournis google.com en tant qu'URL, il doit indiquer le nombre de liens sur google.com et le nombre de liens renvoyés vers google.com (y compris, bien sûr, www.google.com, google.com, google. com/#, etc)tous les liens sur une page, et combien de ces liens vers la même page à nouveau (comment pouvons-nous faire cela en php)?

Est-ce facile à faire, et comment le ferais-je?

(ce n'est pas une question de devoirs si s'il vous plaît fournir autant d'aide que possible

Si vous avez besoin de plus d'informations sur ce que je veux dire avec la question qui vient me demander de faire fournir plus d'informations

Répondre

3

Je vous suggère SimpleXml ou DOM pour cette tâche, mais ils étouffer une balise invalide et, malheureusement, la majorité de la bande est toujours en utilisant une balise invalide, including Google vous avez mentionné dans votre question. Vous pouvez chercher le code HTML de ces URL et tidy, mais vous pouvez également utiliser SimpleHTML

$links = array('inbound' => array(), 
       'outbound' => array()); 

$url = 'http://www.example.com'; 
$host = parse_url($url, PHP_URL_HOST);  
$html = file_get_html($url); 
foreach($html->findElementsByTagName('a') as $link) { 
    $linkHost = parse_url($link->href, PHP_URL_HOST); 
    $type  = ($linkHost === $host) ? 'inbound' : 'outbound'; 
    $links[$type][] = $link->href; 
} 

print_r($links); 

S'il vous plaît noter que je n'ai pas SimpleHTML installé atm, de sorte que le travail peut-être pas au-dessus de la boîte. Il devrait cependant vous orienter dans la bonne direction.


EDIT

Oh boy, ai-je vraiment écrit cela? Étais-je saoul ou quelque chose? Et pourquoi personne ne s'en plaignait? Pour corriger moi-même:

DOM gère le code HTML erroné si vous utilisez la méthode loadHTML(). SimpleXml ne le fait pas. La solution suggérée avec SimpleHtmlDom fonctionnera probablement, mais IMO SimpleHTMLDom est nulle. De meilleures bibliothèques de tiers peuvent être trouvées dans Best Methods to parse HTML.

+0

wow. ne savait pas google n'était pas valide ... lol –

+0

je vais installer le code HTML simple et essayer le code :) – user220755

+0

J'ai fait installer le code HTML simple, et mis en œuvre le code, mais il ne fonctionnait toujours pas, y at-il une raison pour laquelle est-ce événement? – user220755

0

http://php.net/manual/en/book.simplexml.php

Vous pouvez utiliser simpleXML pour trouver tous les liens dans une page, puis analyser les liens qui en résultent avec preg_match pour voir s'ils correspondent à ce que vous cherchez

+0

Ne fonctionne pas pour le code HTML non valide. Vous devriez utiliser Tidy avant SimpleXML ou aller avec SimpleHTML à la place. – Gordon

+0

Il n'a pas mentionné HTML invalide = x Mais je n'ai pas utilisé SimpleHTML auparavant, peut-être que je devrais vérifier :) – Erik

+0

Il a mentionné Google.Cela équivaut à un code HTML invalide;) – Gordon

0

Combinaison d'une expression régulière sion et un hash je dirais. Mon PhP suce, mais ce serait quelque chose comme ça en Perl

my %Counter; 
while(my currentLine = <inData>){ 
if($currentLine = /(www\..+\.+\/)/){ 
    $Counter{$1}++; 
} 
} 

foreach $thingy (keys %Counter){ 
print "There are $Counter{$thingy} links to $thingy in this document\n"; 
} 
+0

Et s'il y a une URL en texte brut dans la page? Il veut des liens. Vous n'analysez pas HTML avec des expressions régulières. – Erik

1

Chargez le contenu de la page dans une variable:

$html = file_get_contents("http://www.somesite.com"); 

et un preg_match() sur $ html

chèque php manuel pour celui-là.

http://www.php.net/manual/en/function.preg-match.php

+1

Bien que cela fonctionne, Regex n'est pas le bon outil pour * analyser * HTML. Regex est pour la correspondance de modèle de chaîne, pas traversée DOM. – Gordon

+0

+1 pour référencer le manuel =) –

Questions connexes