remove regular only from example convert javascript html regex

javascript - only - Eliminando todas las etiquetas de script de html con JS Regular Expression



regular expression javascript (12)

Quiero quitar etiquetas de script de este html en pastebin

http://pastebin.com/mdxygM0a

Intenté usar la expresión regular a continuación

html.replace(/<script.*>.*<//script>/ims, " ")

Pero no elimina todas las etiquetas de script en el html. Solo elimina los scripts en línea. Necesito una expresión regular que pueda eliminar todas las etiquetas de script (en línea y multilíneas). Sería muy apreciado si una prueba se lleva a cabo en mi muestra http://pastebin.com/mdxygM0a

Gracias



/ (?: (?! </ s / w) <[^ <] ) </ s / w * / gi; - Elimina cualquier secuencia en cualquier combinación con


Aquí hay una variedad de scripts de shell que puede usar para eliminar diferentes elementos.

# doctype find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s/</!DOCTYPE/s/+html[^>]*>/</!DOCTYPE html>/gi" {} /; # meta charset find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s/<meta[^>]*content=[/"''][^/"'']*utf-8[/"''][^>]*>/<meta charset=/"utf-8/">/gi" {} /; # script text/javascript find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s//(<script[^>]*/)/(/stype=[/"'']text//javascript[/"'']/)/(/s/?[^>]*>/)//1/3/gi" {} /; # style text/css find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s//(<style[^>]*/)/(/stype=[/"'']text//css[/"'']/)/(/s/?[^>]*>/)//1/3/gi" {} /; # html xmlns find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s//(<html[^>]*/)/(/sxmlns=[/"''][^/"'']*[/"'']/)/(/s/?[^>]*>/)//1/3/gi" {} /; # html xml:lang find . -regex ".*/./(html/|py/)$" -type f -exec sed -i "s//(<html[^>]*/)/(/sxml:lang=[/"''][^/"'']*[/"'']/)/(/s/?[^>]*>/)//1/3/gi" {} /;


En mi caso, necesitaba un requisito para analizar el título de la página Y y tener toda la otra bondad de jQuery, menos los scripts de encendido. Aquí está mi solución que parece funcionar.

$.get(''/somepage.htm'', function (data) { // excluded code to extract title for simplicity var bodySI = data.indexOf(''<body>'') + ''<body>''.length, bodyEI = data.indexOf(''</body>''), body = data.substr(bodySI, bodyEI - bodySI), $body; body = body.replace(/<script[^>]*>/gi, '' <!-- ''); body = body.replace(/<//script>/gi, '' --> ''); //console.log(body); $body = $(''<div>'').html(body); console.log($body.html()); });

Este tipo de accesos directos preocupa al script porque no está tratando de eliminar las etiquetas y el contenido del script, sino que los reemplaza por esquemas de representación de comentarios para romperlos, ya que tendría comentarios que delimitaran las declaraciones del script.

Avíseme si eso todavía presenta un problema, ya que también me ayudará.


Esta Regex también debería funcionar:

<script(?:(?!////)(?!///*)[^''"]|"(?://.|[^"//])*"|''(?://.|[^''//])*''|////.*(?:/n)|///*(?:(?:.|/s))*?/*//)*?<//script>

Incluso permite tener cadenas variables "problemáticas" como estas en el interior:

<script type="text/javascript"> var test1 = "</script>"; var test2 = ''/'</script>''; var test1 = "/"</script>"; var test1 = "<script>/""; var test2 = ''<scr/'ipt>''; /* </script> */ // </script> /* '' */ // var foo=" '' </script>

Parece que jQuery y Prototype fallan en estos ...

Edición del 31 de julio de 2017: se agregó a) grupos que no capturan para un mejor rendimiento (y ningún grupo vacío) yb) soporte para comentarios de JavaScript.


Intentar eliminar el marcado HTML con una expresión regular es problemático. No sabe qué hay allí como script o valores de atributo. Una forma es insertarlo como innerHTML de un div, eliminar cualquier elemento del script y devolver el innerHTML, por ejemplo

function stripScripts(s) { var div = document.createElement(''div''); div.innerHTML = s; var scripts = div.getElementsByTagName(''script''); var i = scripts.length; while (i--) { scripts[i].parentNode.removeChild(scripts[i]); } return div.innerHTML; } alert( stripScripts(''<span><script type="text/javascript">alert(/'foo/');<//script><//span>'') );

Tenga en cuenta que en la actualidad, los navegadores no ejecutarán la secuencia de comandos si se insertan utilizando la propiedad innerHTML, y probablemente nunca lo harán especialmente, ya que el elemento no se agrega al documento.


Los regex son reproducibles, pero si tiene una versión de cadena de HTML que no desea inyectar en un DOM, puede ser el mejor enfoque. Es posible que desee ponerlo en un bucle para manejar algo como:

<scr<script>Ha!</script>ipt> alert(document.cookie);</script>

Esto es lo que hice, usando el jgery regex de arriba:

var SCRIPT_REGEX = /<script/b[^<]*(?:(?!<//script>)<[^<]*)*<//script>/gi; while (SCRIPT_REGEX.test(text)) { text = text.replace(SCRIPT_REGEX, ""); }


Prueba esto:

var text = text.replace(/<script[^>]*>(?:(?!<//script>)[^])*<//script>/g, "")


Puedes probar

$("your_div_id").remove();

o

$("your_div_id").html("");


Si desea eliminar todo el código JavaScript de algún texto HTML, entonces eliminar las etiquetas <script> no es suficiente, porque JavaScript aún puede vivir en "onclick", "onerror", "href" y otros atributos.

Pruebe este módulo npm que maneja todo esto: https://www.npmjs.com/package/strip-js


Siempre que tenga que recurrir a la limpieza de etiquetas de script basadas en Regex. Al menos agregue un espacio en blanco a la etiqueta de cierre en forma de

</script/s*>

De lo contrario, cosas como

<script>alert(666)</script >

permanecería desde los espacios finales después de que los nombres de etiquetas sean válidos.


jQuery usa una expresión regular para eliminar las etiquetas de script en algunos casos y estoy bastante seguro de que sus desarrolladores tenían una maldita buena razón para hacerlo. Probablemente algún navegador ejecute scripts al insertarlos usando innerHTML .

Aquí está la expresión regular:

/<script/b[^<]*(?:(?!<//script>)<[^<]*)*<//script>/gi

Y antes de que la gente empiece a llorar "pero las expresiones regulares de HTML son malas": sí, pero para las etiquetas de script son seguras debido a su comportamiento especial, una sección <script> puede no contener </script> en absoluto a menos que termine en esta posición. Así que emparejarlo con una expresión regular es fácilmente posible. Sin embargo, de una mirada rápida, la expresión regular anterior no tiene en cuenta el espacio en blanco posterior dentro de la etiqueta de cierre, por lo que tendría que probar si </script etc. seguirá funcionando.