2009-09-17 24 views
5

Estoy tratando de devolver el contenido de cualquier etiqueta en un cuerpo de texto. Actualmente estoy usando la siguiente expresión, pero solo captura el contenido de la primera etiqueta e ignora cualquier otra después de eso.¿Cómo obtener regex para que coincida con varias etiquetas de script?

He aquí una muestra de la html:

<script type="text/javascript"> 
     alert('1'); 
    </script> 

    <div>Test</div> 

    <script type="text/javascript"> 
     alert('2'); 
    </script> 

Mi expresiones regulares se ve así:

//scripttext contains the sample 
re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm; 
var scripts = re.exec(scripttext); 

Cuando ejecuto esto en IE6, devuelve 2 partidos. El primero que contiene la etiqueta completa, el segundo que contiene la alerta ('1').

Cuando lo ejecuto en http://www.pagecolumn.com/tool/regtest.htm me da 2 resultados, cada uno con las etiquetas de script solamente.

+0

¿En realidad escribiendo la expresión regular en javascript? ¿Puedes incluir el código correspondiente? – cdm9002

+0

Usando RegexBuddy 3.2.1, esto funciona bien. Captura el contenido de ambas etiquetas. – Phoexo

+0

Estoy usando/gm. Modifiqué la expresión regular un poco. Ahora devuelve 2 resultados, cada uno con una etiqueta de script pero incluye el html. \t ] *> ([\ s \ S] *?) <\/script>/g ¿Cómo puedo devolver sólo el contenido? – Geuis

Respuesta

28

El "problema" aquí está en cómo exec obras. Solo coincide con la primera aparición, pero almacena el índice actual (es decir, posición de referencia) en lastIndex propiedad de una expresión regular. Para obtener todos los partidos se limitan a aplicar expresiones regulares a la cadena hasta que no coincide con (esta es una forma muy común de hacerlo):

var scripttext = ' <script type="text/javascript">\nalert(\'1\');\n</script>\n\n<div>Test</div>\n\n<script type="text/javascript">\nalert(\'2\');\n</script>'; 

var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm; 

var match; 
while (match = re.exec(scripttext)) { 
    // full match is in match[0], whereas captured groups are in ...[1], ...[2], etc. 
    console.log(match[1]); 
} 
+3

Esto resuelve el problema. – asdacap

+0

'. ¡Maldita sea, frustrado de nuevo!'); ' – Svante

+0

@Svante ¿qué tal? :) – kangax

2

intente utilizar el indicador global:

document.body.innerHTML.match(/<script.*?>([\s\S]*?)<\/script>/gmi) 

Editar: añadido de varias líneas y la caja banderas insensibles (por razones obvias).

+0

o, si está utilizando una función de expresión regular, asegúrese de que esté configurada para detectar todas las coincidencias. Algunos de ellos requieren múltiples llamadas, o un parámetro adicional, o una función de diferencia para llamar. – TheJacobTaylor

+0

@TheJacobTaylor Parece algo vago. ¿A qué función de expresiones regulares se refiere usted que no sea 'nuevo RegExp'? –

+0

@Justin Johnson Mi comentario fue impulsado en parte por las preguntas anteriores sobre en qué idioma estaba la expresión regular. Como no estaba seguro, y estaban obteniendo resultados, pensé que podrían haber sido afectados al llamar a la función incorrecta. En PHP, por ejemplo, preg_match y preg_match_all devolverán la primera o todas las coincidencias. – TheJacobTaylor

0

El primer grupo contiene el contenido de las etiquetas.

Editar: ¿No tienes que rodear el regex-satement con comillas? Me gusta:

re = "/<script\b[^>]*>([\s\S]*?)<\/script>/gm"; 
+0

No, no es así. En javascript, /.../ denota una expresión regular. Puedes construirlo como una cadena si quieres, pero luego tienes que ser más explícito en su construcción. Ejemplo: '/ ] *> ([\ s \ S] *?) <\/script>/g' es equivalente a' nuevo RegExp ("] *> ([\ s \ S] *?) <\/script>", "g") ' –

0

En .Net, existe un método subcompacto, en PHP, preg_match_all, que debería resolver su problema. En Javascript no existe ese método. Pero puedes hacerlo solo.

prueba en http://www.pagecolumn.com/tool/regtest.htm

Seleccionar método $ 1elements devolverá lo que quiere

3

No utilizar expresiones regulares para analizar HTML. HTML no es un lenguaje normal. Usa el poder del DOM. Esto es mucho más fácil, porque es la herramienta correcta.

var scripts = document.getElementsByTagName('script'); 
+0

Siempre hay razones para querer analizar manualmente dom de las cadenas. IE8 destruye las etiquetas de scripts si intentas usar innerHTML, por ejemplo. Si estoy construyendo una aplicación usando widgets modularizados y plantillas html, esto se convierte en un problema. – user2867288

+1

Algunas veces necesita desinfectar una cadena HTML antes de convertirla en un DOM. –

+0

@YuvalA .: dos posibilidades: 1. Es HTML no válido; entonces necesitas un "analizador de sopa de etiquetas". 2. Es un HTML válido; entonces necesitas un analizador de HTML. En cualquier caso, puede usar la sintaxis de consulta simple después del análisis. – Svante

0

probar esto

for each(var x in document.getElementsByTagName('script'); 
    if (x && x.innerHTML){ 
      var yourRegex = /http:\/\/\.*\.com/g; 
      var matches = yourRegex.exec(x.innerHTML); 
      if (matches){ 
      your code 
}} 
+0

Ya hay una respuesta aceptada a esta pregunta que logra lo que se necesita. –

Cuestiones relacionadas