剥离输入以完成纯文本

时间:2012-03-04 13:19:02

标签: php mysql

目前正在完成我的评论系统的编码,并希望它能够有效地解决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 ) ) );
}

3 个答案:

答案 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标记的开头。如果您只是希望浏览器显示<,则必须在源代码中编写&lt;htmlentities会将所有相关符号转换为其html实体。

更长的例子

echo htmlentities("<b>this text should not be bold</b><?php echo PHP_SELF;?>");

输出

&lt;b&gt;this text should not be bold&lt;/b&gt;&lt;?php echo PHP_SELF;?&gt;

浏览器将输出

<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代码。