2011-11-13 14 views
10

O qualsiasi altro tag :)Estrai tag di script da una stringa HTML

per es.

<head> 
    <title>page...</title> 
    <script> var a = 'abc'; </script> 
    <script src="foo.js" type="text/javascript"></script> 
    </head> 
    <body> 
    ... 
    <script src="foo2.js"></script> 
    </body> 

(questa stringa è una risposta da una chiamata Ajax)

voglio ottenere un array con 3 stringhe:

  1. <script> var a = 'abc'; </script>
  2. <script src="foo.js" type="text/javascript"></script>
  3. <script src="foo2.js"></script>

Come posso farlo?

risposta

6

Definire: la funzione outerHTML (tratto da here)

jQuery.fn.outerHTML = function(s) { 
return (s) ? this.before(s).remove() : jQuery("&lt;p&gt;").append(this.eq(0).clone()).html(); 
} 

Poi assumere la vostra risposta è memorizzato in data si può fare:

$(data).filter("script").each(function(e) { 
    // do something with $(e).outerHTML() 
}); 
+2

in una stringa piatta come la risposta OPs, '.find()' non corrisponde a nulla. usa invece '.filter()'. – jAndy

+0

@jAndy Hai ragione. Risposta aggiornata – Strelok

+0

grazie per aver terminato la mia ricerca 1 ora –

2

Utilizzare un'espressione regolare con il motivo <script[^<]*</script>.

+1

Le espressioni regolari per abbinare i tag HTML sono ridicolmente più complesse di questo. Non penso che questa sia una buona risposta. Perché preoccuparsi quando tutto il lavoro è stato fatto per te già dal browser. – Strelok

+1

il '

' non può contenere, è troppo tardi .... – jAndy

+0

@Strelok OK, ma la stringa da analizzare è "una risposta da una chiamata Ajax". Alex non ha detto che questo codice HTML verrà inserito nella pagina. Se non lo farai non potrai usare l'albero DOM e le tecniche basate su di esso, come jQuery ... – kol

1

si può provare qualcosa di simile:

function getScriptsAsText() { 
    var div = document.createElement('div'); 
    var scripts = []; 
    var scriptNodes = document.getElementsByTagName('script'); 

    for (var i=0, iLen=scriptNodes.length; i<iLen; i++) { 
    div.appendChild(scriptNodes[i].cloneNode(true)); 
    scripts.push(div.innerHTML); 
    div.removeChild(div.firstChild); 
    } 
    return scripts; 
} 

Restituisce una matrice degli elementi di script correnti come testo, compresi i loro tag di inizio e fine.

Si potrebbe anche provare outerHTML, ma non è ampiamente supportato.

+0

affinché funzioni, è necessario analizzare la stringa html in un documento. https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM?redirectlocale = it-IT & redirectslug = Code_snippets% 3AHTML_to_DOM –

Problemi correlati