2010-11-10 7 views
2

J'utilise jquery et ont une page html entière stockée dans var pageextraction de chaîne avec le javascript

var page = '<html>...<div id="start">......</div><!-- start -->....</html>'; 

Comment puis-je extraire uniquement la partie qui commence par <div id="start"> tout le chemin à après la balise de fin </div><!-- start --> telle que ma sortie est

<div id="start">......</div><!-- start --> 
+3

Vous devriez [définitivement] (http://goo.gl/JnoOO) utiliser regex pour cela. –

Répondre

2
$(page).find('#start').html(); 
+0

Cela obtiendrait le code HTML interne, et pas nécessairement correspondant à la chaîne d'origine. –

+0

Correct. Je me suis demandé s'il fallait écrire cela aussi, mais il a écrit qu'il utilise jQuery (veut utiliser?) Et c'est la seule façon. S'il a besoin de l'élément entier (le outerHTML), il trouvera un moyen de l'envelopper. Mais pour quoi? – AndreKR

+0

Soyez très prudent en lançant '$ (page)' comme cela ... Vous voudrez en sauvegarder une "copie" si vous envisagez d'y faire des recherches très souvent. 'var $ page = $ (page);' Sinon, vous allez créer/détruire plusieurs copies de la représentation DOM ... Aussi, si vous voulez travailler avec jQuery, vous n'aurez pas besoin du '.html() '- ie' $ page.find ("# start"). appendTo ("# target"); ' – gnarf

1
var start = page.match(/(<div id="start">.*?<!-- start -->)/m)[1]; 
+0

Cela ne fonctionnera pas s'il y a un retour à la ligne entre les balises d'ouverture et de fermeture. – Ender

+0

@Ender: Bien sûr, j'ai oublié d'ajouter le "m" pour le mode multi-ligne. –

+0

En tout cas, il y a des chances que le PO ne veuille pas ce qu'il a demandé. Une regex retournera exactement ce qu'il a demandé, mais si ce qu'il veut vraiment est un composant html plutôt que cette chaîne exacte, il devrait utiliser l'analyse jQuery html comme beaucoup d'autres l'ont suggéré. –

1

Cela devrait le faire:

var result = $(page).find('#start')[0].outerHTML; 
+1

[Ceci n'est pas disponible dans tous les navigateurs] (http://www.quirksmode.org/dom /w3c_html.html#t05) - si c'était le cas, le commentaire ne serait pas inclus. –

1

regex. ou la manière paresseuse (que je ne recommande pas, mais est rapide ..) serait de créer un DIV caché, jeter dans la div et faire un sélecteur pour elle

$('#myNewDiv').next('#start').html(); 
1

Une regular expression appropriée vous obtiendrez ce que Tu recherches. Essayez d'utiliser une ligne comme ceci:

var start = page.match(/(<div id="start">[\s\S]*?<\!-- start -->)/)[1]; 

Il utilise JavaScript's match method pour retourner un tableau de correspondances de votre chaîne de page et met le premier sous-match de parenthetized (dans ce cas, votre tag #start et le commentaire suivant) en start.

Voici une démo qui montre ce travail de méthode: http://jsfiddle.net/Ender/mphUj/

2

si elle est valide html, il serait plus facile de laisser le navigateur le faire pour vous. Quelque chose comme ça ferait l'affaire:

var page = '<html><head><title>foo</title><body><div id="stuff"><div id="start">blah<span>fff</span></div></div></body></head></html>'; 

var start_div = $('#start', page).parent(); 
alert(start_div.html()) 

Vous pouvez voir cet exemple en action at jsFiddle. [Edit] Comme @Nick l'a souligné plus haut, cela n'inclurait probablement pas le commentaire html à la fin de la div. Il pourrait également ne pas fonctionner dans tous les navigateurs - je ne sais pas - vous devriez le tester. Post retour et laissez-nous savoir.

Questions connexes