|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
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 ! |
|
|
00
|
|
|
#2 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Il faut utiliser un XPath:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : septembre 2010 Messages : 7 219 ![]() |
regarde du coté de ancestor
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
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.
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 :
$markups = $xpath -> query(sprintf("//*[contains(concat(' ', normalize-space(@class), ' '), ' %s ')]", 'Class1')); |
|
|
00
|
|
|
#5 | |
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
Citation:
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 :
$markups = $xpath -> query(sprintf("//*[(contains(concat(' ', normalize-space(@class), ' '), ' %s ')) and (ancestor::div[1][@class != 'Class2'])]", 'Class1'));
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 :
contains(concat(' ', normalize-space(@class), ' '), ' Class1 ') Code :
$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. |
|
|
|
00
|
|
|
#6 | ||
|
Membre du Club
![]() Boris conception et traitement de documents xhtml Inscription : août 2011 Messages : 107 ![]() |
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 :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com