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 :

[RegExp] Problèmes expressions régulières


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut [RegExp] Problèmes expressions régulières
    Bonjour,

    Voilà j'essaye de me servir des expressions régulières mais n'en ayant jamais fait, je galère un peu ^^


    Alors, je dispose d'une page HTML avec plusieurs <img>

    Je voudrais récupérer automatiquement la source de chaques img pour pouvoir la modifier.

    Le problème est que mes img n'ont pas tous la même syntaxe :

    <img src=test.jpg>
    <img src='test.jpg'>
    <img src="test.jpg">

    Je voudrais à l'aide des expressions régulières récupérer seulement le test.jpg, sans les guillements.

    J'ai fais plusieurs tests mais à chaque fois je récupère test.jpg'> ou test.jpg">.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $corps="<img src='test.jpg'>";
     
    ereg("^<img.+src=[\"\']?(.+)[\"\']?",$corps,$regs);
     
    echo $regs[1];
    J'espère que vous pourrez m'aider.

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    c'était presque ca ;o)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^<img.+src=["\']?([^\'">]+)["\']?>'

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    Ah merci beaucoup !

    Impecable ^^

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 45
    Par défaut
    Blue
    regarde tes messages

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    J'ai un autre soucis.

    Dans ma chaîne, il y plusieurs <img> et je voudrais modifier leurs src respectifs.

    Si je fais le ereg de ma chaine complete, je ne vais récupérer que le dernier src. Moi il me les faudrait tous.

    Je ne sais pas si je suis bien clair, mais je ne sais pas trop comment expliquer mon problème :s

  6. #6
    Fabouney
    Invité(e)
    Par défaut
    Salut blue,

    il faut que tu rajoute l'option "m" (comme multiligne,je sais qu'en PERL ca se passe comme ca) qui enregistre pour chaque ligne le resultat dans le joker.


    donc essay comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ereg("^<img.+src=[\"\']?(.+)[\"\']?/m",$corps,$regs);
    ou si ca fonctionne pas, ds ce cas trouve une autre fonction qui permet de mettre une option, car ereg ne permet pas.
    Dernière modification par Domi2 ; 16/05/2011 à 16h54.

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    En fait, il y a tout plein de fonctions qui gèrent les expressions régulières. Peut-être que preg_match_all() te rendrait mieux service, par exemple.

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    en effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ("/^<img.+src=[\"\']?(.+)[\"\']?/m",$corps,$regs);

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    hum,

    * deja faut enlever le 1er ^ car sinon il ne retournera jamais plusieurs résultats puisque ca le limite au debut de la chaine
    * il faut rétablir le [^\"'>]+ a la place du point . dans la parenthese, ou alors ajouter l'option U a la place afin que le point remplace le minimum de caracteres
    * je pense que terminer par > serait pas mal pour gerer les cas ou il n'y ait pas de ' ou " ;o)

    Edit :
    j'avais pas vu, mais "<img.+src" est mauvais aussi... puisque le .+ remplace n'importe quoi. il vaudrait mieux mettre : [^>]+ a la place de .+ pour etre sur qu'on ne sort pas de la premiere balise img

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Si on veut bétonner l'expression, il ne faut pas oublier que l'on peut écrire les tags HTML en majuscules ou en minuscules... Il vaut donc mieux utiliser le modificateur i.

    Perso, j'aurais fait de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ('/<img.+src=([^>]+)>/iU', $corps, $regs, PREG_SET_ORDER);
    Cette expression devrait fonctionner et te permettrait, quitte à remplacer le source des images, d'effectuer un traitement complet pour corriger la syntaxe HTML deprecated (guillemets simples ou absents).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    J'ai pas trop compris l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/<img.+src=([^>]+)>/iU'
    Elle change quoi par rapport a l'autre ?

    Et si je veux aussi rajouter une condition si ma balise est du style
    En tout ca merci pour votre aide

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ça passe déjà avec mon expression précédente mais si tu veux afiner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ('/<img.+src=([^>]+)[ \/]?>/iU', $corps, $regs, PREG_SET_ORDER);
    • <img.+src : signifie "img" + au moins un caractère (n'importe lequel) + "src="
    • ([^>]+) : au moins un caractère qui ne soit pas ">"
    • [ \/]?> : soit y'a une espace et/ou un slash, soit y'en a pas; y'a un ">" après de toute manière
    • iU : case-insensitive et sois pas radin (= trouve autant de résultats que possible)

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    Il y a un problème avec ton expression Kirkis.
    Les éléments qui me sont renvoyés contiennent les ' ou ".
    Et puis le ?> casse ton expression (il ferme le code PHP) mais ça, je pense l'avoir résolu par un ?\>.

  14. #14
    Fabouney
    Invité(e)
    Par défaut
    et comme ca blue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ('/<img.+src=.+([^>]+).+[ \/]?>/iU', $corps, $regs, PREG_SET_ORDER);

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    Citation Envoyé par Fabouney
    et comme ca blue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ('/<img.+src=.+([^>]+).+[ \/]?>/iU', $corps, $regs, PREG_SET_ORDER);
    La j'ai pas du tout ce qu'il faut :s

    Je pense que celle de Krikis est la plus proche de ce que je recherche, il y a juste les guillemets en trop, que j'essaye d'enlever ^^

  16. #16
    Fabouney
    Invité(e)
    Par défaut
    et comme ca (derniere proposition apres j'arrete lol) ca m'soul je peut pas tester la.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all ('/<img.+src=[\'\"]([^>]+)[\'\" \/]?>/iU', $corps, $regs, PREG_SET_ORDER);

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all ("/<img.+src=['\"]?([^>'\"]+)['\" \/]?\>/iU", $corps, $out, PREG_SET_ORDER);
    L'affichage est bon là, sauf avec des ' ou rien ne s'affiche...

    Je suis pas fan des expressions régulières :s

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 137
    Par défaut
    Alors ? Personne ne peut m'aider ?
    J'arrive au bout du problème là... enfin j'espère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $corps="<img src=\"test3.jpg\" /><img src='test2.jpg' /><img src=test1.jpg />";
     
    preg_match_all ('/<img.+src=["\']?([^>]+)["\']?[ \/]?\>/iU', $corps, $out, PREG_SET_ORDER);
     
    // Affichage : test1.jpg 'test2.jpg', "test3.jpg"
    Pourquoi j'ai toujours les ' et " ?

  19. #19
    Fabouney
    Invité(e)
    Par défaut
    voila, j'ai pu tester :

    la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?
    $string = "<img src=\"test.gif\"/>";
    preg_match_all ('/<img src=[\'\"](.*)[\'\"].+|[\/]?>/iU', $string, $regs, PREG_SET_ORDER);
    echo $regs[0][1];
    ?>

  20. #20
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    a mon avis ca gere pas tout les cas, notemment ceux ou il n'y a pas ni apostrophe ni guillemets...

    J'utiliserais plutot comme chaine :

    '/<img[^>]+src=[\'"]?([^\'">]+)[\'"]?[^>]*>/iU'

    qui gere a peu pres tout les cas. a part celui ou il y a des espaces entre src et = ;o)

    Tu peux aussi t'amuser a gerer le 2eme caractere ' et " avec une référence arriere :

    '/<img[^>]+src=([\'"]?)([^\'">]+)\1[^>]*>/iU'

    Ou meme pire, pour les perfectionniste, faire en sorte que si il n'y a pas de guillemets ou d'apostrophes, on s'arrete au premier espace (ce qui permet de gerer des choses comme <img src=truc.gif border=0> qui dans notre exemple capture "truc.gif border=0")

    Pour ca il faut utiliser des assertions et des masques conditionnels, je ne me risquerais pas a donner un exemple, car je n'ai pas les moyens de tester pour le moment, mais toute la doc est disponible ici :

    http://fr3.php.net/manual/fr/referen...nce.assertions

    (les masques conditionnels sont un peu plus bas)

    Bonne chance ;o)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2011, 15h58
  2. Réponses: 2
    Dernier message: 26/07/2011, 11h02
  3. Réponses: 3
    Dernier message: 31/08/2010, 10h39
  4. [regexp] petit problème d'expression régulière
    Par LE NEINDRE dans le forum Langage
    Réponses: 14
    Dernier message: 16/12/2005, 10h33
  5. [langage] [RegExp] Question d'expression régulière
    Par cloogy dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2003, 09h29

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