目前正在完成我的评论系统的编码,并希望它能够有效地解决Stack Overflow如何使用他们的帖子等,我希望我的用户能够只使用BOLD,Italic和Underscore,并且这样做我会用以下:
_文字_ * BOLD * -Italic -
现在,首先我想知道一种剥离注释的方法,完全清除任何标签,html实体等,例如,如果用户要使用任何html / php标签,它们将从输入。
我目前正在使用Strip_tags,但是这可能会让输出看起来非常讨厌,即使已经进行了滥用或者blatent XSS / Injection尝试,我仍然希望纯文本输出完整,而不是切碎因为strip_tags似乎在这方面造成了绝对的混乱。
我将做的是用粗体html标签替换星号,依此类推AFTER剥离html标签的内容。
人们如何建议我这样做,目前这是评论清理功能
function cleanNonSQL( $str )
{
return strip_tags( stripslashes( trim( $str ) ) );
}
答案 0 :(得分:1)
您可以尝试使用正则表达式去除标记,例如:
preg_replace("/\<(.+?)\>/", '', $str);
不确定这是否是你要找的东西,但它会删除里面的任何东西&lt;和&gt;。你也可以通过要求&lt;之后的第一个字符使它变得更加万无一失。成为一封信。
答案 1 :(得分:1)
PHP标记被<?
和?>
包围,或者在某些古老的安装中可能包含<%
和%>
,因此删除PHP标记可以通过正则表达式进行管理:
$cleaned=preg_replace('/\<\?.*?\?\>/', '', $dirty);
$cleaned=preg_replace('/\<\%.*?\%\>/', '', $cleaned);
接下来,您需要处理HTML标记:这些标记由<
和>
包围。再次,您可以使用正则表达式
$cleaned=preg_replace('/\<.*?\>/','',$cleaned);
这将改变
$dirty="blah blah blah <?php echo $this; ?> foo foo foo <some> html <tag> and <another /> bar bar";
进入
$cleaned="blah blah blah foo foo foo html and bar bar";
答案 2 :(得分:1)
正确的方法不是从用户的评论中删除html标签,而是告诉浏览器不应将以下文本解释为HTML,Javascript等等。想象一下,有人想发布示例代码,就像我们在stackoverflow上做的那样。如果你只是直截了当地删除评论的任何部分似乎是代码,你将搞乱用户的评论。
解决方案是使用htmlentities
,它将在注释中转义用于html标记的符号,这样它实际上只会在浏览器中显示为文本。
例如,浏览器会将<
解释为html标记的开头。如果您只是希望浏览器显示<
,则必须在源代码中编写<
。 htmlentities
会将所有相关符号转换为其html实体。
更长的例子
echo htmlentities("<b>this text should not be bold</b><?php echo PHP_SELF;?>");
输出
<b>this text should not be bold</b><?php echo PHP_SELF;?>
浏览器将输出
<b>this text should not be bold</b><?php echo PHP_SELF;?>
考虑以下现实生活中的解决方案示例,您接受了。想象一下用户写这篇评论。
i'm in a bad mood today :<. but your blog made me really happy :>
现在,您将对文本执行preg_replace("/\<(.+?)\>/", '', $comment);
,它将删除一半注释:
i'm in a bad mood today :
如果这就是你想要的,别介意这个答案。如果不这样做,请使用htmlentities
。
如果要将注释保存为文件而不让服务器解释其中的PHP代码,请使用“.html”或“.txt”等扩展名保存,以便Web服务器不会调用PHP解释器首先。通常没有必要逃避PHP代码。