在我发送电子邮件之前,我使用Tidy清理HTML。一个问题开始持续下去,如果我发送邮件从web上的url获取html,那么文档中可能存在一些javascript。如何使用PHP去除HTML文档中的所有JavaScript?
我想清除这个html文件更多通过剥离出所有的JavaScript,嵌入,引用和任何形式,使邮件只存在的HTML。
我想用php的preg_replace()
去掉邮件中的所有javascript,我需要一些最好的正则表达式的帮助,因为这不是我最强烈的要求,我必须承认。
在我发送电子邮件之前,我使用Tidy清理HTML。一个问题开始持续下去,如果我发送邮件从web上的url获取html,那么文档中可能存在一些javascript。如何使用PHP去除HTML文档中的所有JavaScript?
我想清除这个html文件更多通过剥离出所有的JavaScript,嵌入,引用和任何形式,使邮件只存在的HTML。
我想用php的preg_replace()
去掉邮件中的所有javascript,我需要一些最好的正则表达式的帮助,因为这不是我最强烈的要求,我必须承认。
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);
如图所示here。
+1 clean and easy,我从不明白为什么ppl总是使用`/`作为终止符 – Hannes 2010-11-30 13:07:17
这不会去掉`javascript:`URL或`data:`URL中的javascript,或者事件处理程序中的javascript或javascript中的javascript `表达(...)`或其他方案。它可能不会处理嵌入NUL的`
您可以使用strip_tags
,传递您希望标签允许(白名单)作为第二个参数,但不会删除内联JS - 这可能是目前在的onclick属性和这样。
echo strip_tags($html, '<p><a><small>');
这不能保证(如下),但我试图让我的轻量级解决方案,因为净化器(http://htmlpurifier.org)是我的小目标的几个巨大。 我的目标是防止XSS,仅此而已,因此结果为XSS尝试会有很多的脏东西此代码,但我认为这将是安全的:
<?
//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', '<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 脏代码这个月亮家庭和...但它不是一个好工作(很多情况下需要几个CPU时间),但它比另一个巨大的组件如html净化器为我的小目标更好。
结果将是:
asd
<a STyLE="asd; expression" hRef=" javascript:" onx="asd">asd</a>
asd
<a href="javascript:">asd</a>
<scri<script></script>pt ... >asd</script>
<a style="hey:good boy;" href="javascript:">asd</a>
我没有经验到CSS表达式,但我在IE中使用JS VML的弯角所以可能是危险的了解行为。 最后没有,也没有保证。
我希望它可以为一些朋友 有用)
我用这一个:
//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
删除所有标签,脚本和样式,除了身体和HTML,所以在使用它之后,我使用strip_tags。
您可以像使用任何其他语言一样使用PHP。你不能使用正则表达式。 – AndreKR 2010-11-30 12:46:23