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
Temas para N82
23.04.10 / 23:05
Thanks or Merci (:
hpsam
12.03.10 / 12:28
Attention ereg est deprecated depuis PHP 5.3.0 et supprimée depuis PHP 6.0.0. Utiliser preg_match.
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?
 directory  line  javascript  mercator  conversion  active  des  convertir  longitude  le  ldap  gps  CODE  terrestre  SUR  url  ajax  metar  image  sunyday  une  cli  menu  trou  PAGE  regexp  anim%C3%A9  snmp  www.sunyday.net  et  convertisseur  regex  avec  d%27ozone  authentification  protocole  map  pour  lldp  sunyday.net  anomalie  fade  de  explication  coordonn%C3%A9es  web  fading  find  +  adresse  ntfs  latitude  script  nuls  couche  un  dans  en  synop  la  champ  photovoltaique  html  module  php  browser  google  les  ad  magn%C3%A9tique  

Sunyday.net