Problème d'expression régulière

Problème d'expression régulière - Perl - Programmation

Marsh Posté le 12-07-2004 à 13:28:11    

Bonjour,  
 
voila j'ai un probleme avec l'expression régulière suivante qui me découpe une balise HREF d'une page HTML:
 
/(.*)<\s*a(.*)href\s*=\s*"(.*)"(.*)>(.*)/
  $1           $2                    $3   $4    $5
 
Avec le code suivant, <a href="test.html">Test</a>  j'obtiens pour $3 :
    test.html
 
Avec le code suivant, "<a href="test.html"><img src="image.jpg"></a>, j'obtiens pour $3 :
    test.html"><img src=
 
Le premier fonctionne bien mais pour le deuxième, j'aimerais avoir le même résultat que pour le premier, c'est à dire que je n'obtienne pour $3 que le contenu entre les premieres côtes ouvrantes et les premières côtes fermantes.
 
J'attends votre aide
 
Merci

Reply

Marsh Posté le 12-07-2004 à 13:28:11   

Reply

Marsh Posté le 12-07-2004 à 13:39:04    

Remplace le "tout caractère" pour $3 par "des caractères alphanumériques, un point, des caractères alphanumériques"
 
/(.*)<\s*a(.*)href\s*=\s*"(\w*\.\w*)"(.*)>(.*)/

Reply

Marsh Posté le 12-07-2004 à 13:45:25    

je suis d'accord mais si le lien est le suivant :
   <a href="http://serveur/test.html">...
ca ne marche pas

Reply

Marsh Posté le 12-07-2004 à 13:51:27    

/(.*)<\s*a(.*)href\s*=\s*"(.*\w*\.\w*)"(.*)>(.*)/
 
Dans ce cas là: tu récupères : http://serveur/test.html

Reply

Marsh Posté le 12-07-2004 à 14:01:50    

c'est pareil

Reply

Marsh Posté le 12-07-2004 à 14:10:53    

En attendant de pouvoir le faire avec une seule expression régulière. voilà une solution avec deux conditions  
 

Code :
  1. if($fic1 =~ /(.*)<\s*a(.*)href\s*=\s*"(.*\w*\.\w*)"(.*)>(.*)/){
  2. my $toto = $3;
  3. if($toto =~ /(.*)"><.*$/){
  4.  $toto =$1;
  5. }
  6. print "$toto\n";
  7. }

Reply

Marsh Posté le 12-07-2004 à 14:12:28    

Tu veux récupérer quoi dans $5, les autres balises?

Reply

Marsh Posté le 12-07-2004 à 14:14:58    

dans :
  $1 : rien
  $2 : rien
  $3 : test.html
  $4 : rien
  $5 : <img src="image.jpg"></a>

Reply

Marsh Posté le 12-07-2004 à 14:27:26    

Voilà une solution sans prendre en compte tes $1, $2 et $4 vu que tu n'attends rien dedans
 
Chaine de caractère :  

Code :
  1. <a href=\"http://serveur/test.html\"><img src=\"image.jpg\"></a>


 
Expression régulière

Code :
  1. /<\s*a.*href\s*=\s*"(.*)">(<.*><.*> )*$/


 
Résultats

Code :
  1. $1: http://serveur/test.html
  2. $2: <img src="image.jpg"></a>


 
Per contre il faut faire attention car si tu as <a "href=\"http://serveur/test.html\">" comme cahine de caractère $2 est NULL et peut poser des problèmes

Reply

Marsh Posté le 12-07-2004 à 14:39:06    

ok merci ca marche mais le problème c'est que je peux récupérer les autres $i

Reply

Marsh Posté le 12-07-2004 à 14:39:06   

Reply

Marsh Posté le 12-07-2004 à 14:40:44    

si par exemple, il y a un target dans la balise <a..

Reply

Marsh Posté le 12-07-2004 à 14:44:15    

([^<]*)<\s*a(.*)href\s*=\s*"+([^ "<]*)[ "]+([^>]*)>(.*)/

Reply

Marsh Posté le 12-07-2004 à 14:53:52    

c'est ce que j'avais pensé merci

Reply

Marsh Posté le 13-07-2004 à 12:12:36    

Re salut,  
 
cette expression regulière fonctionne mais lorsque j'ai deux balises <a href> qui se suivent, seule la deuxième est traitée.  
 
ex :  
 
<a href="Test1.html">Test1</a><a href="Test2.html">Test2</a>  
 
Et donc :  
$1 : <a href="Test1.html">Test1</a>  
$2 :  
$3 : Test2.html  
$4 :  
$5 : Test2</a>

Reply

Marsh Posté le 14-07-2004 à 00:09:03    

pourquoi tu utilises pas un module existant pour parser ton html?


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 19-07-2004 à 18:59:33    

voila une regexp que j'utilisais:
 

Code :
  1. my $tags = join("|", qw(
  2.   a
  3.   applet
  4.   area
  5.   base
  6. ));
  7. $html =~ s!<\s*($tags)(.*?)\s*>!callback($1,$2)!gsie;
  8. sub callback {
  9.   my $tag = lc(shift);
  10.   (%attr) = $_[0] =~ /\s+(.*?)\s*=\s*"(.*?)"/gso;
  11.   ...
  12. }


 
en fait c'etait pour doubler HTML-Parser (la callback a la meme "forme" ) pour avoir un truc redondant, mais HTML-Parser etait plus rapide et trouvais plus de liens malgres tout.


Message édité par pospos le 19-07-2004 à 18:59:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed