¿Cómo elimino todo javascript de un documento HTML usando PHP?

En mi progtwig de correo electrónico utilizo Tidy para limpiar el HTML antes de enviar los correos electrónicos. Está empezando a persistir el problema de que si envío un correo buscando el html desde una url en la web, puede existir algún javascript en el documento.

Quiero limpiar aún más este documento html eliminando todo javascript, embedded, referencedo y en cualquier forma para que el correo exista solo en html.

Quiero usar php's preg_replace() para quitar todo javascript de un correo y necesito ayuda con la mejor expresión regular porque no es mi punto más fuerte, debo confesar.

 echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var); 

Como se muestra aquí .

Puede usar strip_tags , pasando las tags que desea permitir (list blanca) como el segundo parámetro, pero eso no eliminará el JS en línea, que podría estar presente en las properties onclick y demás.

 echo strip_tags($html, '<p><a><small>'); 

Mire Crear una expresión regular para quitar javascript del artículo Html . Y parte 2 .

No hay garantía con esto (como a continuación), pero traté de hacer mi solución ligera porque el purificador de html ( http://htmlpurifier.org ) es muy grande para mi pequeño objective. Mi objective es evitar XSS y nada más, por lo que el resultado de los bashs de XSS será un montón de cosas sucias para este código, pero creo que será SEGURO:

 <? //href="javascript: //style="....expression //style="....behavior //<script //on*=" $str = ' asd <a STyLE="asd; expression" hRef=" javascript:" onx="asd">asd</a> asd <code><a href="javascript:">asd</a></code> <scr<script></script>ipt ... >asd</script> <a style="hey:good boy;" href="javascript:">asd</a>'; function stripteaser($str, $StripHTMLTags = true, $AllowableTags = NULL) { $str = explode('<code>', $str); $codes = array(); if (count($str) > 1) { foreach ($str as $idx => $val) { $val = explode('</code>', $val); if (count($val) > 1) { $uid = md5(uniqid(mt_rand(), true)); $codes[$uid] = htmlentities(array_shift($val), ENT_QUOTES, 'UTF-8'); $str[$idx] = "##$uid##" . implode('', $val); } } } $str = implode('', $str); while (stripos($str, '<script') !== false) { $str = str_ireplace('<script', '&lt;script', $str); } $rptjob = function(&$str, $regexp) { while (preg_match($regexp, $str, $matches)) { $str = str_ireplace($matches[0], htmlentities($matches[0], ENT_QUOTES, 'UTF-8'), $str); } }; $rptjob($str, '/href[\s\n\t]*=[\s\n\t]*[\"\'][\s\n\t]*(javascript:|data:)/i'); //href = "javascript: $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\"][^\"]*expression/i'); //style = "...expression $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\'][^\']*expression/i'); //style = '...expression $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\"][^\"]*behavior/i'); //style = "...behavior $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\'][^\']*behavior/i'); //style = '...behavior $rptjob($str, '/on\w+[\s\n\t]*=[\s\n\t]*[\"\']/i'); //onasd = " if ($StripHTMLTags) $str = strip_tags($str, $AllowableTags); foreach ($codes as $idx => $code) { $str = str_replace("##$idx##", $code, $str); } return $str; } echo stripteaser($str); exit; ?> 

: D Código sucio para esta luna en casa y … Sin embargo, no es un buen trabajo (muchas condiciones toman un poco de time de CPU) pero es mejor que otro gran componente como el purificador html para mi pequeña meta.

EL RESULTADO SERÁ:

 asd <a STyLE=&quot;asd; expression" hRef=&quot; javascript:" onx=&quot;asd">asd</a> asd &lt;a href=&quot;javascript:&quot;&gt;asd&lt;/a&gt; <scri&lt;script></script>pt ... >asd</script> <a style="hey:good boy;" href=&quot;javascript:">asd</a> 

No tengo experiencia para grabar expresiones, pero sé sobre el comportamiento que se usa para JS VML en IE para curvas curvas, por lo que puede ser peligroso. Y FINALMENTE NO HAY NINGUNA GARANTÍA.

Espero que pueda ser útil para un amigo;)

Usé este:

 //remove js,css,head..... static function cleanElements($html){ $search = array ( "'<script[^>]*?>.*?</script>'si", //remove js "'<style[^>]*?>.*?</style>'si", //remove css "'<head[^>]*?>.*?</head>'si", //remove head "'<link[^>]*?>.*?</link>'si", //remove link "'<object[^>]*?>.*?</object>'si" ); $replace = array ( "", "", "", "", "" ); return preg_replace ($search, $replace, $html); } 

http://allenprogram.blogspot.pt/2012/04/php-remove-js-css-head-obj-elements.html

Elimina todas las tags, scripts y styles, excepto body y html, así que después de usarlo, utilizo strip_tags.