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 :

Récupérer les balises img ayant un attribut égal à X parmi X attributs


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut Récupérer les balises img ayant un attribut égal à X parmi X attributs
    Bonjour,

    Je viens poster très rarement car généralement je n'ai pas de soucis avec les Regex. Aujourd'hui je dois être fatigué car une Regex qui me paraissait toute simple est en train de m'agacer depuis 2 heures. J'ai mon café à côté donc ca peut encore aller... :p

    Voici le contexte:
    J'ai du code HTML avec plein de balises dont plusieurs balises img.
    Parmi toutes les balises img de mon code, il y en a qui possède un src égale à "image/miniature/laphoto.jpg" avec d'autres attributs pouvant varier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <img src="image/miniature/laphoto.jpg" alt='la photo' />
    <img style='width:100px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    <img style='border:1px solid;height:50px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    J'aimerai pouvoir récupérer dans un tableau toutes les balises img ayant la valeur src égale à "image/miniature/laphoto.jpg".

    Ce qui me pose problème c'est le fait que le nombre d'attribut à l'intérieur des balises images en question peuvent toutes changer (sauf l'attribut src évidement).

    Une idée pour que je n'entame pas mon 3ème café ? :p

    Merci d'avance, je reste sur le forum pour toutes questions.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    comme d'hab : pour parser du HTML c'est DOMDocument

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Allez sans trop réfléchir je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    $a = <<<SC
    <img src="image/miniature/laphoto2.jpg" alt='la photo' />
    <img style='width:100px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    <img style='border:1px solid;height:50px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    SC;
     
    $src = 'image/miniature/laphoto.jpg';
    preg_match_all('#(<img.*src="'.$src.'".*/>)#im', $a, $matches);
     
    print_r($matches[0]);
    ?>

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci pour cette réponse !!

    Cela dit j'ai tout mes résultat dans la meme cellule de tableau à savoir matches[0][0].
    Je crois même que s'il y a du texte entre deux balises images contenant le bon SRC et bien il me récupére les deux balises plus le texte au milieu...ce que je ne souhaite pas.

    Est il possible de mettre chaque résultat dans une cellule différente du tableau matches[] ? et de ne pas prendr ele texte présent entre les deux balises ?

    Merci beaucoup. Après ceci j'aurai enfin fini

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Utiliser une regex pour parser un document DOM (ou XML) c'est comme faire une boucle pour faire une addition histoire de pas utiliser l'opérateur +
    comme d'hab : pour parser du HTML c'est DOMDocument
    et dans ton cas DOMXPath sera le plus adapté.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Je comprends bien

    Mais je ne sais pas du tout utiliser xpath.

    En réalité je ne vois pas comment formuler ma requete qui me semble compliqué pour le débutant que je suis en xpath (j'ai du utiliser ca une fois juste pour parcourir une balise, rien de plus)...

    Mais sinon je comprends bien qu'une regex est "stupide"...

    Peux tu m'aider à résoudre mon probleme ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    le langage xpath est plus naturel que les regex

    pas dur :
    //img[@src="image/miniature/laphoto.jpg"]

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Oui vu comme ca c'est sur que c'est plus simple mais je viens de comprendre que pour utiliser Xpath il fallait charger un fichier xml... or le problème est que moi (j'aurai du le préciser) je n'ai qu'une variable php qui contient 3000 caractères. Je n'ai donc pas d' entete html dans ma variable et cela semble poser probleme quand je souhaite utiliser xpath:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $doc = new DOMDocument($contenu);
    $xpath = new DOMXpath($doc);
     
    $elements = $xpath->query('//img[@src="image/miniature/laphoto.jpg"]');
     
    if (!is_null($elements)) {
      foreach ($elements as $element) {
        echo "<br/>[". $element->nodeName. "]";
     
        $nodes = $element->childNodes;
        foreach ($nodes as $node) {
          echo $node->nodeValue. "\n";
        }
      }
    }
    Dois je donc obligatoirement revenir à mes Regex ?


    EDIT: bon j'ai dit n'importe quoi je me suis aperçu qu'en réalité mes images n'étaient tout simplement pas trouvées.
    L'expression que tu m'as donné semble donc être fausse ou alors me suis je trompé?

    Merci en tout cas

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    deja ton code est faux, et DOMDocument lit du DOM donc HTML ou XML ou autre

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Ok si ca lit du DOM mais moi je fais comment vu que je n'ai qu'une variable ? Ca revient donc à passer par des regex ? Dans ce cas là je dois abandonner le xpath ?

    Merci ^^

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par ghostfile Voir le message
    Ok si ca lit du DOM mais moi je fais comment vu que je n'ai qu'une variable ? Ca revient donc à passer par des regex ? Dans ce cas là je dois abandonner le xpath ?

    Merci ^^
    tu verras que dans la doc y'a loadHTML

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    J'ai regardé la doc et donc j'ai corrigé mon tire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $doc = new DOMDocument();
    $doc->loadHTML($contenu);
    $doc->saveHTML();
    $xpath = new DOMXpath($doc);
     
    $elements = $xpath->query('//img[@src="image/miniature/laphoto.jpg"]');
     
    if (!is_null($elements)) {
      foreach ($elements as $element) {
        echo "<br/>[". $element->nodeName. "]";
     
        $nodes = $element->childNodes;
        foreach ($nodes as $node) {
          echo $node->nodeValue. "<br />";
        }
      }
    }
    Cela dit rien à faire je n'ai aucun résultat.

    Pourtant je pense avoir fait ca correctement.

    Je fais de mon mieux mais je galère bien bien...

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton niveau d'erreur est bien au maximal ?

    pourquoi avoir fait un saveHTML ?
    pourquoi vérifie combien de résultat te revoir la requete ?
    pourquoi faire is_null, sachant que query renvoie false ?
    pourquoi récupère les sous noeud de <img> sachant que y'en a pas ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Pour le moment j'ai utilisé un peu de la doc et de ce qu'on m'a donné sur le forum :/

    Je cherche juste à afficher quelque chose, après j’enlèverai ce qui ne sert a rien.

    En fait j'aimerai bien savoir comment initialiser DOMXpath. J'arrive vraiment rien à afficher.

    Est ce que ca c'est déjà correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $doc = new DOMDocument();
    $doc->loadHTML($contenu);
    $doc->saveHTML();
    $xpath = new DOMXpath($doc);
     
    $elements = $xpath->query('//img[@src="image/miniature/laphoto.jpg"]');

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton $doc->saveHTML(); sert a rien

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Merci.

    Peux tu me dire dans le code ci dessous ou est ce que ca ne va pas stp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (!is_null($elements)) {
      foreach ($elements as $element) {
        echo "<br/>[". $element->nodeName. "]";
     
        $nodes = $element->childNodes;
        foreach ($nodes as $node) {
          echo $node->nodeValue. "<br />";
        }
      }
    }
    Histoire d'avoir un indice

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    je l'ai déjà dit plus haut, a la base c'est pour faire quoi tout ça ? tu vas en faire quoi ?

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    C'est compliqué mais en gros je remplace toutes les images portant le src en question pour afficher à la place un iframe avec X paramètres.

    C'est assez compliqué à expliquer mais je pense avoir bien expliqué ce dont je voulais faire.

    Une regex m'aurait vraiment suffit, enfin je pense.

    Voici le code que m'a donné codesrc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $a = <<<SC
    <img src="image/miniature/laphoto2.jpg" alt='la photo' />
    <img style='width:100px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    <img style='border:1px solid;height:50px;' src="image/miniature/laphoto.jpg" alt='la photo' />
    SC;
     
    $src = 'image/miniature/laphoto.jpg';
    preg_match_all('#(<img.*src="'.$src.'".*/>)#im', $a, $matches);
     
    print_r($matches[0]);
    En fait il presque parfait !:p
    Il faudrait juste que chaque balise img trouvé soient dans une cellule différentes du tableau matches.
    Car là, si dans ma variable j'ai:
    "toto <img height='100' src='image/miniature/laphoto.jpg' /> blabla <img alt='laphoto' src='image/miniature/laphoto.jpg' style='width:130px;' /> titi"

    Il va me mettre dans matches[0] ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img height='100' src='image/miniature/laphoto.jpg' /> blabla <img alt='laphoto' src='image/miniature/laphoto.jpg' style='width:130px;' />
    Alors que j'aurai voulu avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matches[0]="<img height='100' src='image/miniature/laphoto.jpg' />"
    matches[1]="<img alt='laphoto' src='image/miniature/laphoto.jpg' style='width:130px;' />"
    C'est plus claire ?

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    non c'est bien avec DOMDocument qu'il va falloir faire, tu pourras en plus creer plus facilement ton iFrame via createElement

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 40
    Points
    40
    Par défaut
    Oui je pense que c'est mieux DOMDocument mais comme je n'y arrive pas et que les développeurs semblent plus m'apporter de solution avec les regex je ne compte pas y passer l'éternité et quitte à utiliser du code plus lourd et bien tant pis :/
    C'est assez urgent et il ne me reste plus que demain pour trouver une solution.

    DOMDocument n'affiche rien et pourtant j'ai cherché toute l'après midi.

    Comment tu t y prendrais pour réussi cet exploit qui me retient depuis plusieurs heures ? :/
    As tu un code à me donner et si possible à m'expliquer ? (meme à corriger le code que j'ai publié)

    Je suis pourtant certain que ca doit pas etre sorcier, mais quand on débute, on cherche souvent pour rien jusqu'à ce que quelqu un nous l'enseigne.

    Merci encore pour tes efforts stealth35.

Discussions similaires

  1. [MySQL] Récupérer une balise <img> dans un article depuis une table MySQL
    Par GeDeon35 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 22/09/2011, 15h20
  2. Réponses: 2
    Dernier message: 09/12/2010, 21h03
  3. Comment récupérer les balises enfant ?
    Par souffle56 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/08/2010, 22h21
  4. [XML] HTML dns XML -> Récupérer les balises intérprétées comme du XML
    Par dacid dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 16/04/2010, 17h59
  5. Réponses: 4
    Dernier message: 15/06/2006, 23h07

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