1

有人刚刚在我的网站上创建了一个组,其中有一个描述\n\r。问题是我已经对描述文本这样做了:

//Convert all urls to links
$group_description = preg_replace('#([\s|^])(www)#i', '$1http://$2', $group_description);
$pattern = '#((http|https|ftp|telnet|news|gopher|file|wais):\/\/[^\s]+)#i';
$replacement = '<a href="$1" target="_blank">$1</a>';
$group_description = preg_replace($pattern, $replacement, $group_description);

$group_description = str_replace("\'" , "'", $group_description );
$group_description = nl2br($group_description);

/* Convert all E-mail matches to appropriate HTML links */
$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.';
$pattern .= '[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i';
$replacement = '<a href="mailto:\\1">\\1</a>';
$group_description = preg_replace($pattern, $replacement, $group_description);

你可以看到这发生在这里

你看那里说\n\r Welcome to Join的。

为什么没有变成<br />标签?

这可能很重要,这是我首先将这段文本放入数据库的方式:

$group_description = mysql_real_escape_string($_POST['group_description']);
// And then insert the $group_description into the db without doing any more operations on it.

知道为什么我仍然得到\n\r吗?

4

2 回答 2

6

问题是 \r 和 \n 分别作为 "\" "r" 和 "\" "\n" 存储在您的数据库中。它们不存储为回车符或换行符,而是斜线字符后跟字母。当您调用nl2br()时,它正在寻找换行符,而不是它的文本表示。希望这是有道理的。

您可以使用正则表达式 ( preg_replace) 或str_replace替换它们。但问题可能是由数据插入数据库的方式引起的。

例如:

$string = str_replace('\n', "\n", $string);
$string = str_replace('\r', "\r", $string);

您会注意到我在第一个引号中使用了单引号,在第二个中使用了双引号。使用单引号时,“\r”和“\n”存储为文本,而不是特殊字符。这可能是因为它们没有正确存储在您的数据库中。

于 2011-07-01T06:36:36.290 回答
2

你已经自己回答了。mysql_real_escape_string还将换行符转换为转义序列\r\n.

您必须首先应用您的转换(包括nl2br)并在 mysql_query 之前进行数据库转义/编组。(但你知道,还有更容易使用的数据库 API。)

于 2011-07-01T06:38:13.710 回答