10
votes

DOM XPATH pour trouver #Text Nœuds et envelopper la balise de paragraphe

Je voudrais trouver tous les nœuds de notes de niveau de racine (ou ceux avec des parents div parents) qui doivent être enveloppés dans une balise

. Dans le texte suivant, il devrait y avoir trois (voire seulement deux) racine finale

. xxx

L'idée est de formater le texte plus agréable de sorte que le texte Les blocs sont regroupés dans des paragraphes pour l'affichage HTML. Cependant, le XPath suivant que j'ai travaillé semble ne pas avoir échoué à sélectionner les nœuds de texte. xxx


4 commentaires

Pourquoi avez-vous mis // div dans votre expression XPath si vous souhaitez également sélectionner des nœuds de texte en dehors de div s? Ce violon semble faire ce que vous voulez.


Pouvez-vous me dire ce qui ne va pas avec la solution que j'ai postée ci-dessus? Voulez-vous convertir du texte avec de nouvelles lignes en plusieurs paragraphes?


@nwellnhof, votre solution est bonne - mais ce n'est pas une réponse, donc je ne peux rien vous accorder.


@nwellnhof, incroyable! Merci!


4 Réponses :


8
votes

OK, alors laissez-moi reformuler mon commentaire comme une réponse. Si vous souhaitez correspondre à tous les nœuds de texte, vous devez simplement supprimer la pièce // div de votre expression XPath. Donc, il devient: xxx


1 commentaires

Comment cela va-t-il fonctionner avec

ce texte est ok mais que diriez-vous Ceci ? ?



1
votes

Vous pouvez le faire avec pure JavaScript si vous souhaitez:

var content = document.evaluate(
                                      '//text()', 
                                      document, 
                                      null, 
                                      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
                                      null );

for ( var i=0 ; i < content .snapshotLength; i++ ){
  console.log( content .snapshotItem(i).textContent );
}


0 commentaires

2
votes

Votre scénario a de nombreux cas de bord et le mot devrait em> ajoute sur le dessus. Je suppose que vous voulez faire le classique une double pause commence un nouveau paragraphe em> thingy, mais cette fois au sein de parent

code> (ou certainement d'autres éléments de blocs). Je laisserais faire l'analyseur HTML la plupart du travail, mais je travaillerais toujours avec la recherche de texte et remplacer (à côté de XPATH). Donc, ce que vous verrez venir est un peu pirate de piratage mais je pense assez stable: p>

Tout d'abord, je sélectionnerais tous les nœuds de texte de haut niveau ou d'enfant de ladite div. P>

<div>
<p class="break">

    This text should be wrapped in a p tag.
</p>
</div>
<p class="break">
This also should be wrapped.
</p>
<p class="break">
<b>And</b> this.</p>


2 commentaires

Belle explication, cependant, votre démo ne semble pas réellement atteindre ce résultat.


Comme écrit à la fin, cela est dû à la normalisation des espaces manquantes. Assurez-vous que l'entrée utilise \ n en tant que séparateur de ligne, le CODEPAD semble utiliser \ r \ n ou quelque chose de SIMMilar, c'est pourquoi vous le voyez différent. Je peux vérifier que plus tard à nouveau, je viens de remarquer quand je l'ai collé, sur ma propre boîte, le code fonctionne. Alors essayez de vous-même, cela pourrait déjà fonctionner sur votre boîte.



1
votes

Je sais que ce n'est pas xpath mais vérifiez cela:

PHP Simple HTML DOM Parser

http://simplehtmldom.sourceforge.net/

Caractéristiques

Un analyseur HTML DOM écrit dans PHP5 + vous permet de manipuler HTML de manière très facile!

prend en charge HTML non valide.

Rechercher des balises sur une page HTML avec des sélecteurs, comme JQuery.

Extrait du contenu de HTML dans une seule ligne.


1 commentaires

S'il vous plaît montrer à votre réponse comment cela fonctionne avec cette bibliothèque, sinon cela n'est que partiellement associé (et pour mes goûts personnels, cette bibliothèque est une mauvaise suggestion, PHP a tout de suite intégré ce que cette bibliothèque offre, que php simple HTML DOM Parser La bibliothèque a été écrite à l'origine pour PHP 4 sans les extensions basées sur la libxml car elles n'existaient pas jusqu'à présent.