【问题标题】:PHP regular expression to remove all javascript with exceptionPHP正则表达式删除所有javascript异常
【发布时间】:2011-09-30 21:04:06
【问题描述】:

我正在寻找一种从 html 字符串中删除所有 JavaScripts 标签的方法。

以下正则表达式工作正常,但我想添加一个例外:

$html = preg_replace('#<script[^>]*>.*?</script>#is', '', $html);

如何添加一个规则以使 text/html 类型的脚本被忽略?

<script type="text/html" ... > ... </script> 

有什么建议吗?

提前致谢。

【问题讨论】:

  • 使用 HTML 解析器代替正则表达式:php.net/manual/en/book.dom.php
  • 酷,这就是我正在做的事情。目前使用 Zend_Dom_Query。你知道 xpath 的选择器是什么样子的吗?
  • 不允许preg_replace 在正则表达式上指定e 标志,以便将替换字符串视为代码。您不能将其与查找type="text/html" 的替换表达式一起使用,如果它存在则返回整个脚本标记,否则返回空白。

标签: php javascript regex tags


【解决方案1】:

您可能不会尝试清理不受信任的 HTML,但只是为了让这个问题的读者不要误会:

这不会删除&lt;script&gt;元素之外的javascript:&lt;img src=bogus onerror=alert(42)&gt;

它不会删除几乎没有混淆的脚本:&lt;script&gt;alert(42)&lt;/script &gt;

它将无效内容转换为脚本:&lt;scrip&lt;script&gt;&lt;/script&gt;t&gt;alert(42)&lt;/script&gt;.

我并不是说这就是你想要做的。您可能有充分的理由这样做,但与不受信任的输入无关,但是,对于以后的读者,不要尝试仅使用正则表达式来滚动您自己的 HTML 清理程序。

【讨论】:

  • 好评论,你是对的,但老实说,我对此并不太在意。 ;) 我不想删除内联脚本。更多关于异常的信息。
【解决方案2】:

使用不会落入 Mike 指针的贪婪匹配,如下所示:

$html = preg_replace('#<script.*</script>#is', '', $html);

这应该(贪婪地)匹配所有脚本标签。至于例外,我不知道该怎么做,对不起。

【讨论】:

  • 如果页面的头部和底部附近都有脚本标签,这个正则表达式几乎会删除整个页面。
  • 那是一个设计糟糕的页面。
  • 别贪心,用.*?而不是 .*
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2010-10-20
  • 2020-06-25
  • 2011-12-23
  • 2011-11-01
  • 2021-07-23
相关资源
最近更新 更多