SEP
26
PHP RegEx analyser les URL d'une page
26.09.2007 | | Auteur : Ayashi | Catégorie : Programmation
Les expressions régulières sont extrêmement puissantes et permettent de réaliser du filtrage de chaine en très peu de lignes de code. Dans cet article nous allons réaliser un script qui télécharge une page web et liste toutes les URL qu'elle contient.

Ce genre de script peut être utile pour créer un robot qui parse des pages web et cherche les liens internes ou externes au site. Il faut dans ce cas stocker dans une base de données les résultats pour pouvoir les traiter ultérieurement.

Pour réaliser ce script nous allons utiliser deux fonctions php : ereg et preg_match_all. ereg va nous permettre de décortiquer l'adresse internet de la page à télécharger afin d'extraire :
  • Le protocole utilisé ( http, https )
  • Le nom du serveur web ( www.google.com )
  • Les éventuels répertoires ( /MyPage/blabla/ )
Le script PHP-CLI ( voir l'article PHP-CLI Command Line Interface ) que je vous propose s'exécute depuis la ligne de commande. Il accepte en argument l'URL de la page à télécharger puis à analyser.

Voici l'expression régulière utilisée :
Si on test avec l'URL http://fr.wikipedia.org/wiki/Expressions_rationnelles nous obtenons le découpage :

Array
(
    [0] => http://fr.wikipedia.org/wiki/
    [1] => http://
    [2] => fr.wikipedia.org
    [3] => /wiki/
)

..Ceci nous permettra de reconstruire par la suite les adresse internes au site et obtenir une URL complète. Regardons maintenant comment se fait la recherche des liens dans la page web. Nous allons cette fois ci utiliser la fonction preg_match_all qui va nous permettre de rechercher plusieurs occurences dans le code source de la page. L'expression régulière utilisée est la suivante :
Cette expression va rechercher toutes les chaines commençant par <a href = ( indépendamment des espaces et de la casse ), extraire la valeur entre quotes ou double quotes ( ' ou " ) et ne reprendre qu'après la fin de cette balise ( > ). Les résultats seront stockés dans un array à deux dimensions remplis par la fonction preg_match_all. Les liens sont ensuites analysés afin de déterminer si ils ont absolus ou relatifs. Si ils sont relatifs, le script les reconstruits avec les informations retirées avec ereg : Un petit test permet aussi de supprimer les mailto:, javascript:, telnet: qui ne sont pas intéréssant pour nous! Le script en action :

Z:\>php -q ParseLinks.php http://meteo.app.intra/Home.php

  http://meteo.app.intra/DL.php?Kind=TempAir&StationID=&TF=24h
  http://meteo.app.intra/DL.php?Kind=TempAir&StationID=&TF=7d
  http://meteo.app.intra/DL.php?Kind=TempAir&StationID=&TF=30d
  http://meteo.app.intra/DL.php?Kind=Pressure&StationID=&TF=24h
  http://meteo.app.intra/DL.php?Kind=Pressure&StationID=&TF=7d
  http://meteo.app.intra/DL.php?Kind=Pressure&StationID=&TF=30d
  http://meteo.app.intra/DL.php?Kind=Humidy&StationID=&TF=24h
  http://meteo.app.intra/DL.php?Kind=Humidy&StationID=&TF=7d
  http://meteo.app.intra/DL.php?Kind=Humidy&StationID=&TF=30d
  http://www.google.com

..et le code source :
Tags : php, regex, parse, link | Digg!
Commentaires  | Ajouter un commentaire
Telemoveis Nokia
29.01.10 / 4:33
Merci beaucoup :)
Laurent
10.07.09 / 2:45
C'est exactement ce que je cherchais ... parce que les RegEx c'est un peu hardu. Un grand merci.
manuel laser
29.06.09 / 7:14
Just to let you know that the script works fine.Erase my last comment (wasn't really that smart).Thanks
manuel laser
27.06.09 / 9:03
Le Regex est simplement fantastique!Je ne comprend pas ça: $URL = $argv[1]; Je peux utilizer $URL=
Merlin
29.03.08 / 2:48
Comme toujours, article excellent ! Il faudra que je teste ton script :)
Rechercher sur internet  ?  | Rechercher!
Trackback
Utilisez le lien http://www.sunyday.net/trackback-PHP-RegEx-parsers-les-URL-d-une-page pour faire un trackback vers cette article depuis votre site web. Les trackbacks sont soumis à une approbation mutuelle et susceptibles d'être supprimés si jugés indésirables.
Retrieve RSS feed. Get notified by eMail. Meteo Parser.
Computing widgets...
Jean-Damien POGOLOTTI© 2k6-2k7 | Design // Code

Qui suis-je?

Touche à tout restant bouche bée devant la complexité et la cohérence de ce monde je m'évertue à essayer d'en comprendre les rouages. En passant par la météorologie, la physique ou bien l'informatique, tout est une raison d'apprendre!
Comment les gens arrivent-il ici?
 couche  lldp  convertisseur  image  avec  trou  regex  gd  nuls  menu  fading  resize  sunyday  synop  sunyday.net  web  +  anim%C3%A9  d%27ozone  photovoltaique  browser  script  ad  magn%C3%A9tique  et  map  active  regexp  en  conversion  longitude  champ  google  dans  mercator  ajax  latitude  cli  url  la  convertir  www.sunyday.net  coordonn%C3%A9es  line  PAGE  php  directory  une  explication  de  CODE  html  gps  snmp  module  ldap  un  fade  pour  terrestre  javascript  authentification  le  ntfs  metar  les  protocole  SUR  adresse  des  

Sunyday.net