我的页面上有一个textarea,我允许用户写文本。为了保留用户在输入时所做的换行,我使用:
editBox.val().replace(/\r?\n/g, "\r\n");
在将数据上传到数据库之前我使用:
$data = mysql_real_escape_string($data);
我这样做是为了保留尽可能多的数据而不剥离以后可能有用的数据。这也有助于我保留以后可以允许的格式化选项。我读到这是一个很好的做法。
问题是:
当从数据库中提取数据时,我需要清理它。为此,我使用:
function cleanData($data)
{
$data = nl2br($data);
$data = strip_tags($data,"<br><b><p><i><h1><h2><h3><h4><h5><h6>");
return $data;
}
我允许某些标签稍后将与一个小的自制的所见即所得编辑器一起使用。 但是,这允许用户输入以下内容:
<p title="some junk here">hax</p>
虽然title属性并不令人讨厌,但其他属性也可能。我不确定用户是否可以添加class和id属性,但我不明白他们为什么不能这样做。它还删除任何看起来像标签的内容,例如表情符号:"*<:o) <- happy clown"
最终会看起来像这样:"*"
我尝试使用:
$data = filter_var($data, FILTER_SANITIZE_SPECIAL_CHARS);
而不是cleanData函数,但是这会将显示我的<br>
转换后的换行符的所有内容编码为文本而不是添加换行符。
总之我的问题是:
我似乎无法找到一种清理数据的好方法,因此保留了linebreaks / br,同时还保留了添加某种wysiwyg格式的可能性。我不太关心它的html标签或类似bbCode:[b]
。
我的问题如下:
有没有一种更聪明的方法可以做到这一点,或者通过一些调整我的方法是否合适?
你们会做什么? :)我想避免使用外部库,除非这是一个非常强大的激励措施。
PS :我在很多地方搜索过,发现没有令人满意的答案 - 我也花了很长时间才使这篇文章易读且易读。我希望我做得对。
答案 0 :(得分:1)
首先,
editBox.val().replace(/\r?\n/g, "\r\n");
这不应该在客户端(JavaScript)上完成,而是在服务器端(PHP)上进行,如果你想确定它发生的话。可以通过禁用JavaScript或从其他站点发布来绕过它。
关于实际问题,我会使用一些预制的标记语言,例如Textile,这也是StackOverflow上使用的标记语言。
但是如果你想允许一些自定义格式,你可以(按照你的建议)使用BB-code([b]
,[i]
等)。我实现这一点的方法是首先使用htmlspecialchars
将各个HTML特殊字符替换为各自的HTML实体。在此之后,您可以将[b]
替换为<strong>
等等。
示例强>
$str = "See, [b]evil[/b] input<br/>, <i>etc</i>.";
$str = htmlspecialchars($str);
print $str; // "See, [b]evil[/b] input <br/>, <i>etc</i>."
$str = str_replace(array("[b]","[/b]"),array("<b>","</b>",$str);
print $str; // "See, <b>evil</b> input <br/>, <i>etc</i>."
为避免标记错误,您应该使用一些正则表达式将BBcode替换为HTML标记。