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

Bibliothèques et frameworks PHP Discussion :

[DOM] Rechercher toutes les occurrences d'une balise sauf celles contenues dans des div données


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut [DOM] Rechercher toutes les occurrences d'une balise sauf celles contenues dans des div données
    Bonjour,

    Excusez-moi d'être aussi présent sur ce forum. (Je suis à 100 % sur mon projet PHP DOM et vous sollicite lorsque je bute sur une difficulté, ou lorsque je désire faire part d'une solution trouvée.)


    J'ai besoin de parser toutes les occurrences d'une balise xhtml sauf celles qui se trouvent dans des div spécifiques.
    Typiquement :
    Rechercher les balises <xxx class="Class1"> se trouvant en dehors des div <div class="Class2">.

    Un grand merci d'avance !

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Il faut utiliser un XPath:

  3. #3
    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
    regarde du coté de ancestor

  4. #4
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Il faut utiliser un XPath:
    J'avais pensé libeller ma question « Rechercher à l'aide de Xpath les balises <xxx class="Class1"> se trouvant en dehors des div <div class="Class2"> » mais j'ai omis de mentionner XPath car il me semblait aller de soi que ce type de recherche ne pouvait être effectuée précisément qu'à l'aide de cet outil.


    Citation Envoyé par stealth35 Voir le message
    regarde du coté de ancestor
    Effectivement, la question revient à écrire : sélectionner les noeuds ayant pour classe "Class1" et dont les ancêtres ne sont pas des noeuds de classe Class2.

    Mais comment libeller en syntaxe Xpath "dont les ancêtres ne sont pas des noeuds de classe Class2" ?

    Comment insérer cette condition dans une expression comme celle ci-dessous (copyright Stealth) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $markups = $xpath -> query(sprintf("//*[contains(concat(' ', normalize-space(@class), ' '), ' %s ')]", 'Class1'));
    Je vais donc tâtonner dans cette direction.

  5. #5
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Effectivement, la question revient à écrire : sélectionner les noeuds ayant pour classe "Class1" et dont les ancêtres ne sont pas des noeuds de classe Class2.
    En fait, la question n'est pas correctement formulée.
    Il s'agit plutôt :
    « sélectionner les noeuds ayant pour classe "Class1" et dont le parent div immédiat n'est pas un noeud de classe Class2. »

    Ce qui donne, en reprenant l'expression Xpath mentionnée dans ma précédente réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $markups = $xpath -> query(sprintf("//*[(contains(concat(' ', normalize-space(@class), ' '), ' %s ')) and (ancestor::div[1][@class != 'Class2'])]", 'Class1'));
    Explications :

    contains(concat(' ', normalize-space(@class), ' '), ' %s ') signifie « balise dont l'attribut class contient le terme 'Class1'. » Le paramètre %s remplace le libellé Class1 précisé après l'expression analysée de sprintf (voir cette page)

    ancestor::div[1][@class != 'Class2'])]", 'Class1' signifie « dont le parent div direct a un attribut class différent de Class2 »
    (Si, comme je l'ai initialement fait lors de mes essais, on omet d'indiquer l'indice [1], la recherche trouve toutes les balises class="Class1" indépendamment des div qui les contiennent.
    En effet, ancestor::div[@class != 'Class2']) signifie « dont au moins un ancêtre a un attribut class autre que Class2 », ce qui est toujours le cas, à moins d'envelopper tout le document avec des balises <div class="Class2"> imbriquées.)


    Remarque : Dans la mesure où le nom de la classe Class1 n'est pas variable, on peut simplifier comme suit l'expression recherchant les balises dont l'attribut class contient le terme Class1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')
    ce qui donne finalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $markups = $xpath -> query(sprintf("//*[(contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')) and (ancestor::div[1][@class != 'Class2'])]"));

    PS : J'ai trouvé sur le liste de MSDN un tutoriel Xpath donnant nettement plus d'explications et d'exemples que celui de W3Shools. C'est en travaillant sur ce tuto que j'ai compris la solution à appliquer à ma question.

  6. #6
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Dans la mesure où, dans le cas présent, il n'y a pas besoin de formater la chaîne de recherche, l'expression précédente peut être simplifiée en supprimant l'appel à la fonction sprintf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $markups = $xpath -> query("//*[(contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')) and (ancestor::div[1][@class != 'Class2'])]");

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer toutes les occurrences d'une sous-chaîne
    Par haypo dans le forum Télécharger
    Réponses: 2
    Dernier message: 15/06/2016, 20h17
  2. [XL-2000] Comment sélectionner toutes les occurrences d'une listbox ?
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2013, 11h39
  3. Réponses: 3
    Dernier message: 14/11/2012, 15h25
  4. Réponses: 4
    Dernier message: 07/07/2010, 09h33
  5. supprimer toutes les occurrences d'une chaine dans une autre
    Par identifiant_bidon dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2007, 10h36

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