nl2br()
Статья о функции PHP nl2br(), которая вставляет HTML-переносы строк перед каждым символом новой строки в строке. Полезна для отображения текста.
Функция PHP nl2br() вставляет HTML-перенос строки (<br /> или <br>) перед каждым символом новой строки (\n, \r\n, \r или \n\r) в строке. Это одна из наиболее часто используемых функций в веб-разработке на PHP, поскольку переносы строк в обычном тексте — те, что пользователь вводит нажатием клавиши Enter или которые возвращаются из базы данных, — невидимы в HTML. Браузеры сворачивают пробельные символы, поэтому многострочное сообщение, выведенное непосредственно на страницу, отображается как единая строка без разрывов. nl2br() устраняет этот разрыв, превращая каждый перенос строки в разметку, которую браузер действительно обрабатывает.
В этой главе рассматриваются синтаксис, параметр $is_xhtml, то, что nl2br() делает (и не делает) со строкой, типичный сценарий использования с пользовательским вводом и важный аспект безопасности, который нельзя игнорировать.
Синтаксис
nl2br(string $string, bool $use_xhtml = true): string| Параметр | Описание |
|---|---|
$string | Входная строка для обработки. Обязательный. |
$use_xhtml | Необязательный. Определяет, использовать ли XHTML-совместимые теги <br />. По умолчанию true. При значении false используются обычные теги <br>. |
Функция возвращает новую строку с вставленными переносами; строки PHP неизменяемы, поэтому исходная $string остаётся нетронутой.
Базовый пример
Вывод (необработанный HTML, который получает браузер):
Hello<br />
World!Обратите внимание: исходный символ \n по-прежнему присутствует — nl2br() добавляет <br /> перед символом новой строки, а не заменяет его. Это сделано намеренно: исходный текст остаётся удобочитаемым при просмотре исходного кода страницы, а <br /> обеспечивает видимый перенос строки.
Управление стилем тега с помощью $use_xhtml
Передайте false в качестве второго аргумента, чтобы получить теги <br> в стиле HTML5 вместо самозакрывающейся формы XHTML:
<?php
echo nl2br("Line 1\nLine 2", false);
?>Вывод:
Line 1<br>
Line 2Используйте <br /> (по умолчанию) для документов XHTML или XML; обе формы допустимы в HTML5, поэтому значение по умолчанию работает практически везде.
Реальный сценарий использования: пользовательский ввод
Функция незаменима при выводе текста, введённого пользователем в поле <textarea>. Браузеры игнорируют переносы строк, которые вводит пользователь, поэтому без nl2br() многоабзацный комментарий отображается одним блоком. Однако существует критически важный порядок действий: сначала экранирование, затем преобразование переносов. Если применить nl2br() к необработанному вводу, переносы строк будут защищены, но останется уязвимость XSS, поскольку nl2br() не экранирует HTML — она только добавляет теги <br>.
<?php
$comment = "Hi there\nThanks for the great post!";
// Correct order: escape the HTML, THEN convert newlines.
echo nl2br(htmlspecialchars($comment));
?>htmlspecialchars() нейтрализует символы <, > или &, введённые пользователем, а nl2br() затем добавляет безопасные теги <br />. Если поменять порядок — htmlspecialchars(nl2br($comment)) — собственные теги <br /> будут экранированы в видимый текст <br>, и переносы строк так и не отобразятся.
Распространённые ошибки
- Символ новой строки не удаляется и не заменяется.
\nостаётся в строке. Если нужно убрать перенос строки, применитеstr_replace()после. - Это не функция безопасности.
nl2br()не выполняет экранирование. Всегда используйте её в паре сhtmlspecialchars()для ненадёжного ввода. - Функция обрабатывает только символы новой строки, а не перенос текста в
<textarea>или перенос по словам — эти эффекты визуальные и никогда не попадают в скрипт. - Только для обычного текста. Использовать её вывод как тело email или записывать в CSV бессмысленно; теги
<br>являются HTML и ничего не значат за пределами браузера.
Связанные функции
htmlspecialchars()— экранирование специальных символов перед выводом (используйте вместе сnl2br()).str_replace()— замена подстрок, например для полного удаления переносов строк.strip-tags()— удаление HTML-тегов из строки.trim()— удаление начальных и конечных пробельных символов, включая лишние переносы строк.