Php 从数据库格式化文本
我的页面上有一个文本区,允许用户在其中编写文本。要保留用户在输入时使用的换行符,请使用:Php 从数据库格式化文本,php,javascript,jquery,mysql,Php,Javascript,Jquery,Mysql,我的页面上有一个文本区,允许用户在其中编写文本。要保留用户在输入时使用的换行符,请使用: 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&
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;
}
我这样做是为了保留尽可能多的数据,而不剥离以后可能有用的数据。这也有助于我保留以后可能允许的格式选项。我读到这是一个很好的做法
问题是:
当数据从数据库中取出时,我需要清理它。为此,我使用:
$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;
}
但是,它不是cleanData函数,而是将显示我的
转换换行符的所有内容编码为文本,而不是添加换行符
简而言之,我的问题是: 我似乎找不到清理数据的好方法,因此保留了换行符/br,同时保留了添加某种wysiwyg格式的可能性。我真的不在乎它是html标签还是bbCode:
[b]
之类的东西
我的问题如下: 有没有更聪明的方法来做到这一点,或者我的方法可以稍加调整 你们会怎么做?:)我希望避免使用外部库,除非有非常强的诱因
PS:我四处搜索,没有找到满意的答案——我也花了很长时间使这篇文章可读性和易懂性。我希望我做对了。首先
editBox.val().replace(/\r?\n/g, "\r\n");
这不应该在客户端(JavaScript)上完成,而应该在服务器端(PHP)上完成,如果您想确保它发生的话。可以通过禁用JavaScript或从其他站点发布来规避此问题
关于实际问题,我会使用一些预先制作的标记语言,例如,这也是StackOverflow上使用的语言
但如果您希望允许一些自定义格式,您可以(如您所建议的)使用([b]
,[i]
,等等)。我实现这一点的方法是首先使用它们各自的HTML实体替换所有HTML特殊字符。在此之后,您可以用
等内容替换[b]
示例
$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>."
$str=“参见[b]evil[/b]input
等”;
$str=htmlspecialchars($str);
打印$str;//请参阅[b]evil[/b]input br/,ietc/i
$str=str_replace(数组(“[b]”,“[/b]”),数组(“,”,$str);
打印$str;//“请参阅,邪恶输入br/,ietc/i。”
为了避免错误的标记,您可能应该使用一些正则表达式将BBcode替换为HTML标记。为什么要对从数据库中提取的数据执行mysql转义?这假定您会再次将其填充回查询中。此外,还可以使用real\u escape\u string()应该是您在SQL中使用字符串之前对字符串执行的最后一个操作。任何其他操作都可以撤消转义,并使您再次受到攻击。我会选择外部库,为什么要重新发明轮子?@MarcB您是对的。恐怕它也会加倍转义。该行已删除,但主要问题仍然存在。谢谢您:)@Vyktor这主要是一个学习过程-最终结果可能也是商业性的,除非许可证完全开放,否则我会有问题。你能推荐一个吗?:)呵呵,我真的不记得名字了,我记得它是typo3使用的那个(可能是修改的),我试图通过搜索html编辑器在wiki上查找它,但是wikipedia“今天坏了”,呵呵。为什么不客户端呢?我读到jquery在使用cal时会去除换行符,需要替换。无论是客户端还是服务器,对我来说都无关紧要,但我想了解原因。htmlspecialchars与filter_var($data,filter_SANITIZE_SPECIAL_CHARS)相同吗?谢谢您的回答。如果您想确保数据存储在“\r\n”中,您必须在服务器端执行此操作。您不能信任输入数据。不,
FILTER\u SANITIZE\u SPECIAL\u CHARS
不完全相同,请参阅。它没有逃逸那么多。使用FILTER\u SANITIZE\u FULL\u SPECIAL\u CHARS
将与使用htmlspecialchars
相同。谢谢@Kristian-好的,这解释了一点。但是如果我使用过滤器,我应该如何处理换行符呢?在我的代码示例的第4行中,我将用HTML标记替换所有BBcode。您可以对换行符执行相同的操作,而不是将[b]
替换为
,而是将“\r\n”替换为
。好吧,然后不执行nl2br(),我接受它?明天我会做一些初步测试,看看我能做些什么。如果结果正确,我会更新帖子并将其标记为已回复。再次感谢你。