如何剥离标签,但保持不匹配的`<`代码

时间:2015-03-08 09:04:38

标签: php mysqli

我正在使用mysqli开发一个php聊天系统,其中一个聊天代码就像Facebook一样<3

问题

我的问题是,当我没有为成员发送的消息添加条带标记时,如果成员发布<script> alert('What is this'); ?>,则会显示原始文本。但是当我添加

 <?php $message = strip_tags($message); ?>

...它会从邮件中删除标记,但也会中断<3。我也尝试了htmlentities和htmlspecialchars,但他们都将<3转换为html格式。

问题

如何从标记中删除邮件,但仍允许使用不匹配的<代码,例如<3?例如,<script>应该被允许但不是 </script>,并且不应该允许<?php ?> ,但<anything应该是允许的。

3 个答案:

答案 0 :(得分:1)

我知道这不是你问的问题。但也许htmlentities()可能适合你。

它会将一些特殊字符转换为HTML实体,因此它会按字面打印<string>,但不会执行它。

<?php $message = htmlentities($message); ?>

如果您的消息是:

<script> alert('What is this');</script>

它不会创建弹出窗口,它会在屏幕上显示代码本身。

答案 1 :(得分:1)

您可以尝试将<3替换为&#60;3,而strip_tags不会破坏它。 您可以在此处查看html代码表:http://www.ascii.cl/htmlcodes.htm

答案 2 :(得分:0)

(警告:我从未使用过PHP或MSQLI,所以我可能不知道我在说什么。)

在将字符串传递给tag-stripper之前,您是否考虑过预处理消息以扫描它们是否希望从标记剥离中“保存”?

我不知道tag-stripper是如何工作的,但我想它包含了一些逃避<字符的方法,因此它们不会被识别为标签。如果您在消息字符串中搜索序列<3并插入\以使它们变为\<3,那么该标记剥离器会做什么?这符合您的需求吗?

如果没有办法逃避特殊代码,您可以简单地用不像HTML的东西替换它们。例如,

用户留言:I <3 <b>You</b>! 预处理版本(搜索和替换):I ###HEART### <b>You</b>! 传递给tag-stripper:I ###HEART### You! 最后,用心脏符号替换###HEART###

编辑:根据Petroff的回答,使用&#60;3(这是<3的html代码)可能更好。


如果您输出的符号是unicode点,例如如果<3应该成为U-2665,为什么不首先执行 搜索和替换? unicode点不包含<,因此不会被识别为标记。