Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库格式化文本_Php_Javascript_Jquery_Mysql - Fatal编程技术网

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 &lt;br/&gt;, &lt;i&gt;etc&lt;/i&gt;."
$str = str_replace(array("[b]","[/b]"),array("<b>","</b>",$str);
print $str; // "See, <b>evil</b> input &lt;br/&gt;, &lt;i&gt;etc&lt;/i&gt;."
$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(),我接受它?明天我会做一些初步测试,看看我能做些什么。如果结果正确,我会更新帖子并将其标记为已回复。再次感谢你。