Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/03/2006, 19h32   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 68
Points : 13
Points : 13
Par défaut Parsing complexe de code HTML

Salut,

Voila je ne cherche pas une solution toute faite, a moins vraiment que qqun en ai une lol, mais de l'aide serais déjà très bien.

Mon objectif :

J'enregistre une page web localement sur le server, pour l'ouvrir et ainsi pouvoir parser le code html.

Je dois en faite localiser les liens <a ...>...</a> sur la page, ensuite pour chaqu'un d'eux examiner le href="..." et si celui ci est un lien vers un fichier avec l'extention .zip/.rar, alors je doit obtenir ce qui se trouve entre le <a> et le </a> (le texte linker en qq sorte).

Exemple, si dans le code HTML de la page il y a :
<a href="map/france.zip">Blabla</a>

Alors mon script devra me renvoyer "Blabla".

Voila, étant donné que je n'ai jamais fait qq chose se rapprochant de ca, je suis un peu perdu, je ne sais pas trop bien comment m'y prendre pour analyser les code html, quelles fonctions sont a ma dispositions, lesquelles seraient les plus adaptées, ..

Merci beaucoup si qqun peut m'aider.

PS : Peut-être qu'il y a une librairie PHP gratuite permettant de faire ca ?
choas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2006, 19h47   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Pour donner une piste je te propose ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<textarea rows="25" cols="80"><?php
 
 
$ma_chaine = <<<EOS
Ceci est une chaine comportant <a href="http://example.com" alt="zip">des liens</a> 
et <a href="fichier.zip">seulement</a> des liens. <A href="fichier.tar">Ok ?</A>
EOS;
 
preg_match_all('`<a\s.*href=["\'](.*)["\'].*>(.*)</a>`i', $ma_chaine, $matches);
var_dump($matches);
 
?>
Attention, ce code ne marche pas, l'expression regulière est foireuse. Néanmoins en la corrigeant tu devrais pouvoir t'en sortir... Je suis une quiche en regexp alors je ne peux pas faire plus dans l'immédiat.
En attendant, tu peux te documenter sur http://www.expreg.com/
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 10h25   #3
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Voici une piste plus complète :
Code :
1
2
3
4
5
6
7
8
9
10
11
<?
 
$string = '<a href="truc_1.rar">truc 1</a> <a href="truc_2.jpg">truc 2</a> <a href="truc_3.zip">truc 3</a>';
 
preg_match_all('#<a href="[^"]+\.(?:zip|rar)">(.+)</a>#Ui', $string, $matches);
 
echo '<pre>';
print_r($matches);
echo '<pre>';
 
?>
Je suis parti du principe que tu as des liens correctement formés. Si ce n'est pas le cas, alors il faudra revoir la regex.
Dans cet exemple, tu auras tous tes liens dans $matches[1].
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 10h40   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Merci Kirkis, grâce à l'option U, ma regexp marche nettement mieux !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<textarea rows="25" cols="80"><?php
 
 
$ma_chaine = <<<EOS
Ceci est une chaine comportant <a href="http://example.com" title="zip">des liens</a> 
et <a href="fichier.zip">seulement</a> des liens. <A href="fichier.tar">Ok ?</A>
EOS;
 
preg_match_all('`<a\s.*href=["\'](.*)["\'].*>(.*)</a>`Ui', $ma_chaine, $matches);
var_dump($matches);
 
?>
----------------------
array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(52) "<a href="http://example.com" alt="zip">des liens</a>"
    [1]=>
    string(55) "<a title="fichier zip" href="fichier.zip">seulement</a>"
    [2]=>
    string(30) "<A href="fichier.tar">Ok ?</A>"
  }
  [1]=>
  array(3) {
    [0]=>
    string(18) "http://example.com"
    [1]=>
    string(11) "fichier.zip"
    [2]=>
    string(11) "fichier.tar"
  }
  [2]=>
  array(3) {
    [0]=>
    string(9) "des liens"
    [1]=>
    string(9) "seulement"
    [2]=>
    string(4) "Ok ?"
  }
}

Par contre ce que je reproche avec la tienne c'est qu'il y ait obligatoirement "<a href", nombre d'espace fixe, pas de possibilité d'avoir un attribut entre l'element a et href (Faut bien trouver quelque chose et défendre sa propre solution )
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2006, 11h41   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Pfff, y'a toujours moyen de chipoter

Code :
#<a.*href="[^"]+\.(?:zip|rar)"[^>]*>(.+)</a>#Ui
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h15.


 
 
 
 
Partenaires

Hébergement Web