Forum général.général Help regexp

Posté par  (site web personnel) .
Étiquettes : aucune
0
18
août
2006
J'ai un fichier remplis de lignes de ce type là:

< a class="plop" style="top:50px; left:60px" href="plip.php?x=10&y=50" >< img src='img/1.png'/ >< /a >

(Je sais pas comment publier du html sur templeet, ca à l'air d'être filtré... )

Avec le contenu de class variable, 50, 60, 10 et 50 variables et le '1' .png aussi.
Je cherche à recupérer les valeurs de ces paramètres avec preg_match_all en php.
Qqchose dans ce genre là:

preg_match_all ("?????",$contents, $out, PREG_PATTERN_ORDER);

Quelle motif de recherche appliquer svp??

Merci d'avance
  • # Ca ira, mais...

    Posté par  . Évalué à 4.

    Avec

    <a\s+class="([^"]+)"\s+style="top:(\d+)px;\s+left:(\d+)px"\s+href="plip\.php\?x=(\d+)&y=(\d+)"\s*><img\s+src='img\/(\d+)\.png

    ca va fonctionner, mais c'est généralement une très mauvaise idée de parser du html avec des expressions regulières, et ce que tu demandes la est tres rigide (par ex. quid si x et y ou top et left sont inversés, ou les différents attributs...?),je conseillerais plutot un parser html ou xml, ca doit bien exister en php :)

    • [^] # Re: Ca ira, mais...

      Posté par  . Évalué à 1.

      Euh ... en quoi est ce mal de parser du HTML avec des expressions régulières ?

      Sinon, tu parles de problème au cas ou x et y sont inversés etc... c'est simplement parce que la solution que tu proposes est trop rigide.
      En cherchant une multitude de fois un motif d'attribution de valeur (cf mon post plus bas), plus aucun problème...

      Derrière ça, je conçois parfaitement qu'un parsing manuel sera beaucoup plus souvent sujet au bugs qu'une solution déjà écrite.
      A ce sujet, il existe un certain nombre de modules dédiés à cette tâche:


      [binarym@neotek]:~% apt-cache search '^libhtml.*parse.*perl' 18:39
      libhtml-parser-perl - A collection of modules that parse HTML text documents
      libhtml-simpleparse-perl - HTML::SimpleParse - a bare-bones HTML parser
      libhtml-tokeparser-simple-perl - Perl module used to tokenize HTML documents
      • [^] # Re: Ca ira, mais...

        Posté par  . Évalué à 1.

        Pourquoi c'est mal? Parce que ca ne marchera que dans des cas triviaux.


        Le probleme du HTML est qu'il a une structure recursive (et il correspond à la definition d'un CSL), et que meme si tu arrives à extraire des infos d'un document HTML avec des expressions régulières, ca ne pourra fonctionner que si tu es sur à 100% de ce que tu vas parser (d'ou mon "rigide").

        Exemple (HTML valide):

        <a href="</a>" <!-- >Ca pourrait s'arreter ici</a> --> >bleh<!-- ou encore ici... </a> --></a>

        Tu n'arriveras jamais à t'en sortir avec une seule expression, du moins pas avec PCRE qui ne supporte pas les ??{}, tout simplement parce que tu n'as aucune idée de l'etat dans lequel tu te trouves au moment ou tu rencontres le 1er, 2eme, 3eme ou 4eme </a>

        J'ai jamais dit que ma solution était bonne, j'ai juste répondu éxactement à ce qu'il voulait (un match, pistou.), à ses risques et périls.
  • # There's more than one way to do it

    Posté par  . Évalué à 4.

    [binarym@trait-plat]:~% cat test.pl
    #!/usr/bin/perl

    while(<STDIN>){
    while(/(top|left|x|y)(:|=)(\d+)/g){ print "$1 => $3\n"; }
    }
    [binarym@trait-plat]:~% cat file
    < a class="plop" style="top:50px; left:60px" href="plip.php?x=10&y=50" >< img src='img/1.png'/ >< /a >

    [binarym@trait-plat]:~% cat file| perl test.pl
    top => 50
    left => 60
    x => 10
    y => 50
    [binarym@trait-plat]:~%

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.