2011-11-13 9 views
10

O cualquier otra etiqueta :)etiquetas Extracto de guión de una cadena HTML

para, por ejemplo.

<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> 

(esta cadena es una respuesta de una llamada AJAX)

Quiero obtener una matriz con 3 cuerdas:

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

¿Cómo puedo hacer eso?

Respuesta

6

definir: la función outerHTML (tomado de here)

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

A continuación, se supone que su respuesta se almacena en data que puede hacer:

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

en una cadena aplanada como la respuesta de OP es, '.find()' no coincidirá con nada. use '.filter()' en su lugar. – jAndy

+0

@jAndy Estás en lo correcto. Respuesta actualizada – Strelok

+0

gracias por terminar mi búsqueda de 1 hora –

2

Utilice una expresión regular con el patrón <script[^<]*</script>.

+1

Las expresiones regulares para hacer coincidir las etiquetas HTML son ridículamente más complejas que esto. No creo que esta sea una muy buena respuesta. ¿Por qué molestarse cuando el navegador ya ha hecho todo el trabajo por usted? – Strelok

+1

el '

' no puede contenerse, es demasiado tarde ... – jAndy

+0

@Strelok OK, pero la cadena que se analizará es "una respuesta de una llamada ajax". Alex no dijo que este código HTML se insertará en la página. Si no lo hace, entonces no puede usar el árbol DOM, y las técnicas basadas en él, como jQuery ... – kol

1

Usted puede intentar algo como:

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; 
} 

Devuelve una matriz de los elementos del script actual como texto, incluyendo sus etiquetas de inicio y finalización.

También puede probar outerHTML, pero no es ampliamente compatible.

+0

para que esto funcione, debería analizar la cadena html en un documento. https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM?redirectlocale = en-US & redirectslug = Code_snippets% 3AHTML_to_DOM –

Cuestiones relacionadas