IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Aide pour régex


Sujet :

Langage PHP

  1. #1
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Par défaut Aide pour régex
    Bonjour tout le monde,

    je viens vous voir car je rencontre actuellement un problème sur une regex...

    alors tout d'abord voilà la chaine sur laquelle je travaille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a rel="lightbox" class="enlarge" title="" href="http://ecx.images-amazon.com/images/I/71abTXeIKYL._SL600_.png">  <img src="http://ecx.images-amazon.com/images/I/71abTXeIKYL._CR85,0,328,328_SS220_.png" alt="3OH!3" title="3OH!3" width="220" height="220"/> </a>
    je précise au passage que d'autres caractères peuvent être présents avant et après cette chaine.

    Mon objectif est de récupérer le lien contenu dans la balise img, en me basant sur la classe enlarge du lien. Pour celà j'ai fait cette regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $regex = '/enlarge[^>]+> <img([^>]+)>/';
    Le problème est que ça marche pas J'aimerai donc savoir si vous pouvez m'aider car là je me prend un peu la tête et j'avance pas

    Je vous remercie d'avance pour votre aide
    Finality

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour,



    Ça m’a l’air d’être tout simplement qu’il y a 2, et non 1, espaces dans ’png"> <img’
    à moins que la chaîne que tu as postée ait une erreur à ce niveau.

    S’il n’y a pas d’erreur, tu devrais prendre
    /enlarge[^>]+> *<img ([^>]+)>/
    ’ *’ = un blanc suivi d'une étoile, signifie ’zéro, un ou plusieurs blancs’

    NB: j’ai ajouté un blanc après img de façon à ce que le groupe capturé commence par ’src....’

  3. #3
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Par défaut
    Coucou

    en effet il y avait un problème, avec les espaces qui étaient en fait des tabulations (la chaine est obtenue à partir d'un code source d'un site). Du coup j'ai modifié ma regex pour obtenir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $regex = '%class="enlarge[^>]*?><img(.*?)[^>]><[^>]*?>%';
    Et là j'obtiens une chaine de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    src="http://ecx.images-amazon.com/images/I/71abTXeIKYL._CR85,0,328,328_SS220_.png" alt="3OH!3" title="3OH!3" width="220" height="220"
    du coup il ne me reste qu'à isoler le contenu du src, mais je sèche à ce niveau là tu peux me conseiller ?

    merci pour ton aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    En Python, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ch = 'soleil\nlune\tmars\njupiter'
    print ch
    print
    print repr(ch)
    j’obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    soleil
    lune	mars
    jupiter
     
    'soleil\nlune\tmars\njupiter'
    Il doit bien y avoir une fonction en PHP qui fasse la même chose que repr() , c’est à dire fournir la valeur de la chaîne et non pas l’affichage de la chaîne moyennant son interprétation par un moteur de rendu d’affichage.

    C’est ce que tu devrais utiliser pour savoir exactement quels sont les caractères présents dans une chaîne.





    Pour le contenu de src , je peux t’aider, bien sûr.
    Qu’entends tu par “contenu de src“ ?

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    cela te suffit il comme code ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $chaine = '<a rel="lightbox" class="enlarge" title="" href="http://ecx.images-amazon.com/images/I/71abTXeIKYL._SL600_.png">  <img src="http://ecx.images-amazon.com/images/I/71abTXeIKYL._CR85,0,328,328_SS220_.png" alt="3OH!3" title="3OH!3" width="220" height="220"/> </a>';
     
    $uneAutreURL = "image.jpg";
    $chaine = preg_replace('#enlarge(.*)src="(.*)"#', 'enlarge$1src="'.$uneAutreURL.'"', $chaine);

  6. #6
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Par défaut
    Tout d'abord je tiens à tous vous remercier pour votre aide

    Madfrix je ne vois pas pourquoi utiliser preg_replace vu que je souhaite récupérer des informations et non les modifier ....

    Sinon après de nombreuses tentatives, j'ai enfin réussie à obtenir une regex qui me donne le bon résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex = '%class="enlarge[^>]*?><img.*?src="(.*?)".*?[^>]><[^>]*?>%';
    Je vous remercie encore pour votre aide
    Finality

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Il y a plusieurs problèmes.

    Ce n’est pas
    enlarge[^>]*?><img
    Il manque la tabulation au milieu de ><
    ce doit être \s+ , comme en Python où \s = caractères blanc,'\t','\n','r' etc.



    Le ? après [^>]* ne sert à rien
    ? après un quantificateur * ou + module l’activité du quantificateur.
    Ça ne sert qu’après .* ou .+ pour limiter le caractère gourmand du point . qui matche avec tout.
    Mais [^>] n’est pas un symbole entièrement gourmand , il va s’arrêter devant '>' de toutes façons




    Remarque: s’il y a 'enlarge’ il y a '"' devant lui, et donc derrière aussi. Et un blanc aussi d’ailleurs.

    Donc il est mieux d’écrire



    Je ne pense pas qu’il soit non plus nécessaire d’avoir img.*?src au lieu de img *src
    Je vois mal qu’il puisse y avoir autre chose que des blancs entre 'img' et 'src'
    Mais peut être, dans ton cas....





    Il vaut mieux écrire aussi
    src="[^"]*"

    .*? et .+? donnent parfois des surprises, quand le moteur de regex ne trouve pas ce qu’il veut apres le caractère d'arret qu’on souhaite, il va s’arrêter au suivant. C’est des cas assez subtils. Je n’ai pas d’exemple sous la main mais j’ai eu à debugger un cas qui m’a fait comprendre qu’il vaut mieux utiliser [^...] quand on peut.





    Aussi:
    et non pas sans le blanc




    Mais personnellement, j’écrirais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class="enlarge" [^>]*>\s*<img src="([^"]*)"[^>]*/>\s*</[^>]*>
    car je ne vois pas ce qui justifie la fin de ta RE.

Discussions similaires

  1. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo