L'utilisation de XPath avec PHP SimpleXML pour trouver les nœuds contenant une Chaîne de caractères
J'essaie d'utiliser SimpleXML en combinaison avec XPath pour trouver des noeuds qui contiennent une certaine chaîne de caractères.
<?php
$xhtml = <<<EOC
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<p>Find me!</p>
<p>
<br />
Find me!
<br />
</p>
</body>
</html>
EOC;
$xml = simplexml_load_string($xhtml);
$xml->registerXPathNamespace('xhtml', 'http://www.w3.org/1999/xhtml');
$nodes = $xml->xpath("//*[contains(text(), 'Find me')]");
echo count($nodes);
Prévu de sortie: 2
De sortie: 1
Lorsque je modifie le code xhtml du deuxième alinéa de
<p>
Find me!
<br />
</p>
alors qu'il fonctionne comme prévu. Comment est-ce que mon expression XPath a ressembler pour correspondre à tous les nœuds contenant "Trouvez-moi", peu importe où ils sont?
Aide de PHP DOM-XML est une option, mais ce n'est pas souhaitée.
Merci à l'avance!
OriginalL'auteur xlttj | 2010-09-16
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que vous voulez faire. Vous pouvez sélectionner tous les
<p/>
les éléments qui contiennent "me Trouver" dans l'un de leurs descendants, avecCe sera le retour de doublons et si vous ne spécifiez pas le type de nœuds, alors il sera de retour
<body/>
et<html/>
.Ou peut-être vous voulez un nœud qui a un enfant (pas un descendant), nœud de texte qui contient "Trouvez-moi"
Ce sera pas de retour
<html/>
ou<body/>
.J'ai oublié de mentionner que
.
représente l'ensemble du texte contenu d'un nœud.text()
est utilisé pour récupérer [un ensemble de nœuds de] les nœuds de texte. Le problème avec votre expressioncontains(text(), 'Find me')
est quecontains()
ne fonctionne que sur les chaînes, pas nodesets et, par conséquent, il convertittext()
à la valeur du premier nœud, c'est pourquoi la suppression de la première<br/>
.OriginalL'auteur Josh Davis
Euh, euh? Mais merci @Jordy pour la réponse rapide.
D'abord, c'est le DOM XML, ce qui n'est pas souhaitable, car tout le reste de mon script est fait avec SimpleXML.
Deuxième, pourquoi avez-vous traduire en lettres majuscules et de recherche pour le changement de chaîne "Trouvez-moi"? 'De la recherche pour" TROUVEZ-MOI " serait effectivement donner un résultat.
Mais vous m'a orienté vers la bonne direction:
fait le tour!
OriginalL'auteur xlttj
Je cherchais un moyen de savoir si un nœud avec la valeur exacte "Trouvez-Moi" existe et cela semblait fonctionner.
OriginalL'auteur Willy
OriginalL'auteur Jordy