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 :