Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1789 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Problème d'expression régulière

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème d'expression régulière

n°793518
xavro
Posté le 12-07-2004 à 13:28:11  profilanswer
 

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

mood
Publicité
Posté le 12-07-2004 à 13:28:11  profilanswer
 

n°793526
Charlux
Posté le 12-07-2004 à 13:39:04  profilanswer
 

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*)"(.*)>(.*)/

n°793532
xavro
Posté le 12-07-2004 à 13:45:25  profilanswer
 

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

n°793536
Charlux
Posté le 12-07-2004 à 13:51:27  profilanswer
 

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

n°793544
xavro
Posté le 12-07-2004 à 14:01:50  profilanswer
 

c'est pareil

n°793549
Charlux
Posté le 12-07-2004 à 14:10:53  profilanswer
 

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. }

n°793552
Charlux
Posté le 12-07-2004 à 14:12:28  profilanswer
 

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

n°793554
xavro
Posté le 12-07-2004 à 14:14:58  profilanswer
 

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

n°793572
Charlux
Posté le 12-07-2004 à 14:27:26  profilanswer
 

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

n°793590
xavro
Posté le 12-07-2004 à 14:39:06  profilanswer
 

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

mood
Publicité
Posté le 12-07-2004 à 14:39:06  profilanswer
 

n°793594
xavro
Posté le 12-07-2004 à 14:40:44  profilanswer
 

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

n°793601
alknon
Posté le 12-07-2004 à 14:44:15  profilanswer
 

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

n°793618
xavro
Posté le 12-07-2004 à 14:53:52  profilanswer
 

c'est ce que j'avais pensé merci

n°794549
xavro
Posté le 13-07-2004 à 12:12:36  profilanswer
 

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>

n°795339
burgergold
5$? va chez l'diable!
Posté le 14-07-2004 à 00:09:03  profilanswer
 

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


---------------
http://www.boincstats.com/signature/user_664861.gif
n°799893
pospos
Posté le 19-07-2004 à 18:59:33  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Problème d'expression régulière

 

Sujets relatifs
Expression Reguliere cplx, need help.[BASH] SED et expression régulière
Probleme lors de la creation de toolbar avec wxwidgetsProblème de mise en page (Access2000)
Problème d'url rewriting[ PHP ] Problème d'expression régulière... ([0-9]{1,2}\.[0-9]{1,2})
Problème sur une expression régulièrePetit problème avec expression régulière...
Expression Reguliere ... Où est le problème ?Probleme d'expression reguliere
Plus de sujets relatifs à : Problème d'expression régulière


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR