如果我使用nl2br(),为什么会出现\ n \ r?

时间:2011-07-01 06:31:40

标签: php encoding nl2br

有人在我的网站上创建了一个组,其中包含\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);

您可以看到here发生这种情况。

你看到它说\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

2 个答案:

答案 0 :(得分:6)

问题是\ r和\ n分别以“\”“r”和“\”“\ n”存储在数据库中。它们不是存储为回车符或换行符,而是字母后面的斜杠字符。当您呼叫nl2br()时,它正在寻找新的行字符,而不是它的文本表示。希望这是有道理的。

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

例如:

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

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

答案 1 :(得分:2)

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

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