Преобразование новой строки в представленный текст в PHP - PullRequest
4 голосов
/ 26 февраля 2012

У меня настроена система, позволяющая пользователям отправлять свои статьи в мою базу данных. Поскольку это будет просто HTML, я не хочу ожидать, что они будут знать, что они будут набирать <br /> каждый раз, когда появляется новая строка, поэтому я использую функцию PHP nl2br() для ввода.

Я также предоставляю инструмент для модификации статей, который вернет их статьи в форму (однако это другая страница) и позволит им редактировать ее. При этом элементы <br /> также появлялись (с новыми символами строки). Чтобы исправить появившиеся элементы
(как я и ожидал), я добавил preg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content")), который нашел в другом вопросе на этом сайте. Он выполняет работу по удалению элементов <br />, но, поскольку он заменяет их новыми строками, а новые строки в любом случае остались бы изначально, каждый раз, когда редактируется сообщение, будет добавляться все больше и больше новых строк, размечая абзацы и больше каждый раз. Это то, что пользователь не поймет.

В качестве примера, скажем, я ввожу в форму отправки статьи следующее:

 Hello, this is my article.
 I am demonstrating a new line here.

Это преобразует в:

Hello, this is my article.<br />
I am demonstrating a new line here.

Обратите внимание, что, хотя символ новой строки был преобразован, в тексте по-прежнему есть новая строка. В форме редактирования <br /> будет преобразован обратно в новую строку и будет выглядеть следующим образом:

Hello, this is my article.

I am demonstrating a new line here.

Потому что <br /> был преобразован в новую строку, но новая строка уже была. Итак, я думаю, что я ожидаю, что он будет первоначально преобразован во что-то вроде этого:

Hello, this is my article.<br />I am demonstrating a new line here.

Мне интересно ... есть ли способ остановить функцию nl2br() от сохранения оригинальных строк? Может ли это быть связано с персонажем Windows \r\n?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012

Похоже, проблема, которую вы описали, не ошибка, а особенность bl2br. Вы можете просто написать свою собственную функцию для этого, например:

<?php
function NlToBr($inString)
{
    return preg_replace("%\n%", "<br>", $inString);
}
?>

Я нашел это в комментариях к документации по nl2br-функции в руководстве по PHP: http://php.net/manual/de/function.nl2br.php. Если тот, который я опубликовал, не работает для вас, должно быть еще много, откуда он взялся.

(Или просто используйте функцию из другого Ответа, который только что был опубликован, я думаю, это тоже должно работать)

2 голосов
/ 26 февраля 2012

Используемая вами функция, nl2br используется для их вставки, но не замены.Если вы хотите заменить \n на <br />, вам просто нужно использовать str_replace.Вот так:

$string = str_replace("\n","<br />",$string);

В этой ситуации абсолютно не нужно регулярное выражение.

1 голос
/ 26 февраля 2012

Это должно исправить:

preg_replace('/<br(\s+)?\/?>(?!\s*\n)/i', "\n", mysql_result($result,$i,"content"))

Вы не можете просто удалить разрывы, потому что они могут быть на одной строке. Это регулярное выражение заменит все разрывы на новую строку, но не те, за которыми следует новая строка.

Это оставит <br>\n в тексте. Дополнительное регулярное выражение избавится от них:

preg_replace('/<br(\s+)?\/?>/i', "", $res)
...