使用 preg_replace 删除 <script> 标签

6

我正在使用 preg_replace 过滤一个字符串(从文本文件中提取),并删除所有的 <script> 和 </script> 标签。但是,它会删除实际的文本 "script",但却保留了 <> 符号。我尝试替换 /<(尝试将其视为文字),但这只会生成错误。如何删除尖括号?输入内容为 <script>Text</script>,以下是代码:

$file = file_get_contents($directory . "original-" . $name);
$file = htmlentities($file);
$file = preg_replace('<script>', '', $file);
$file = preg_replace('<\script>', '', $file);

以下是输出结果:

  <>TEXT</>

2
你缺少分隔符和转义字符,而且 htmlentities 正在改变你的字符串,它可能不包含你期望的内容。 - Rangad
你能给我展示一下它应该是什么样子的吗?我对正则表达式真的很新。 - mattegener
@mattegener 只需在替换脚本标签后放置 htmlentities 行。此外,它是正斜杠 / 而不是反斜杠 \。 - Rahil Wazir
@RahilWazir 我尝试过了,但结果和之前的尝试一样。 - mattegener
3个回答

7
答案是:
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

但是你可能想要查看strip_tags函数


尽管这就是原因,你只是简单地陈述“答案是<这个>”,而没有解释为什么它是答案。 - Ismael Miguel
2
因为1.这个网站已经解释过无数次了,而这个问题几乎每天都会出现。2.这个问题很可能不应该用正则表达式来解决,应该使用strip_tags代替。 - Alex
PHP支持多个分隔符,字符< >是一组支持的分隔符。只需要一行代码,你不会死的,而且你会得到一个更好的答案。 - Ismael Miguel

4
你在 preg_* 函数中使用的模式需要在前后加上某种分隔符。PHP 允许使用多种不同的分隔符,所以它将你的尖括号视为正则表达式分隔符,而不是模式的一部分。我通常使用 {} 作为分隔符,其他人使用斜杠、井号、方括号、圆括号等。尖括号也可以作为分隔符,这就是为什么你的模式失败的原因。
你可以通过在模式周围添加一些分隔符来解决此问题,例如:
$file = preg_replace('/<script>/', '', $file);

此外,请注意PHP正则表达式是区分大小写的,因此您的模式会被标记为<SCRIPT><Script>所干扰。模式(在结束定界符后)之后的i修饰符使其不区分大小写(/<script>/i)。此外,还有许多不同的编写HTML标记的方式仍然可以由浏览器解释,例如:
<script type="text/javascript">...</script>
<script src="..." />

顺便提一下,也许我对你的问题读得太多了,但你不应该,我再说一遍,不要使用正则表达式来解析HTML,特别是为了进行净化处理


没有代码示例,你的答案相当不完整。但我完全同意最后一句话。 - Ismael Miguel

0

$html = preg_replace('#(.*?)#is', '', $html);

$html = preg_replace('#(.*?)#is', '', $html);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接