Почему \ n \ r появилось бы, если бы я использовал nl2br ()? - PullRequest
1 голос
/ 01 июля 2011

Кто-то только что создал группу на моем сайте, у которой есть описание с \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?

Ответы [ 2 ]

6 голосов
/ 01 июля 2011

Проблема в том, что \ r и \ n хранятся в вашей базе данных как "\" "r" и "\" "\ n" соответственно. Они хранятся не как символ возврата каретки или новой строки, а как символ косой черты, за которым следует буква. Когда вы звоните nl2br(), он ищет символ новой строки, а не его текстовое представление. Надеюсь, это имеет смысл.

Вы можете использовать регулярное выражение (preg_replace) или str_replace для их замены. Но проблема, вероятно, вызвана тем, как данные вставляются в вашу базу данных.

Например:

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

Вы заметите, что я использовал одинарные кавычки для первой и удвоил для второй. При использовании одинарных кавычек «\ r» и «\ n» хранятся в виде текста, а не специальных символов. Это может быть связано с тем, что они неправильно хранятся в вашей базе данных.

2 голосов
/ 01 июля 2011

Вы сами ответили.mysql_real_escape_string также преобразует переводы строк в escape-последовательности \r и \n.

Сначала вы должны применить свои преобразования (включая nl2br) и выполнить экранирование / маршалинг базы данных непосредственно перед mysql_query.(Но вы знаете, что API-интерфейсы для баз данных также намного проще.)

...