nl2br — Вставляет HTML-код разрыва строки перед каждым переводом строки



Web-технологии: База знаний

Документация PHP


nl2br — Вставляет HTML код разрыва строки перед каждым переводом строки


string nl2br ( string $string )

Возвращает строку string , в которой перед каждым переводом строки вставлен ‘

Замечание: Начиная с PHP 4.0.5, nl2br() работает в соответствии со стандартом XHTML. До версии 4.0.5 использовалось ‘
‘ вместо ‘

Пример #1 Пример использования nl2br()

echo nl2br ( «foo — это вам не\n bar» );


nl2br — Вставляет HTML-код разрыва строки перед каждым переводом строки


Возвращает строку string , в которой перед каждым переводом строки (\r\n, \n\r, \n и \r) вставлен ‘
‘ или ‘

Список параметров

Использовать ли совместимые с XHTML переводы строк или нет.

Возвращаемые значения

Возвращает измененную строку.


Пример #1 Пример использования nl2br()

Результат выполнения данного примера:

Пример #2 Генерирование корректной HTML-верстки с помощью параметра is_xhtml

Результат выполнения данного примера:

Пример #3 Различные разделители строк

Результат выполнения данного примера:

Список изменений

Версия Описание
5.3.0 Добавлен необязательный параметр is_xhtml .
4.0.5 nl2br() теперь совместима с XHTML. Все старые версии возвращали string , в которой перед переводами строк были вставлены ‘
‘ вместо ‘

Смотрите также

  • htmlspecialchars() — Преобразует специальные символы в HTML-сущности
  • htmlentities() — Преобразует все возможные символы в соответствующие HTML-сущности
  • wordwrap() — Переносит строку по указанному количеству символов
  • str_replace() — Заменяет все вхождения строки поиска на строку замены


It’s important to remember that this function does NOT replace newlines with
tags. Rather, it inserts a
tag before each newline, but it still preserves the newlines themselves! This caused problems for me regarding a function I was writing — I forgot the newlines were still being preserved.

If you don’t want newlines, do:

Seeing all these suggestions on a br2nl function, I can also see that neither would work with a sloppy written html line break.. Users can’t be trusted to write good code, we know that, and mixing case isn’t too uncommon.

I think this little snippet would do most tricks, both XHTML style and HTML, even mixed case like

function br2nl ( $text )
return preg_replace ( ‘/
/i’ , » , $text );

to replace all linebreaks to

the best solution (IMO) is:

function nl2br2 ( $string ) <
$string = str_replace (array( «\r\n» , «\r» , «\n» ), «
» , $string );
return $string ;

because each OS have different ASCII chars for linebreak:
windows = \r\n
unix = \n
mac = \r

works perfect for me

On the contrary, mark at dreamjunky.comno-spam, this function is rightfully named. Allow me to explain. Although it does re-add the line break, it does so in an attempt to stay standards-compliant with the W3C recommendations for code format.

According to said recommendations, a new line character must follow a line break tag. In this situation, the new line is not removed, but a break tag is added for proper browser display where a paragraph isn’t necessary or wanted.

After a recent post at the forums on Dev Shed, I noticed that it isn’t mentioned, so I will mention it.

nl2br returns pure HTML, so it should be after PHP anti-HTML functions ( such as strip_tags and htmlspecialchars ).

Here’s a more simple one:

* Convert BR tags to nl
* @param string The string to convert
* @return string The converted string
function br2nl ( $string )
return preg_replace ( ‘/\
/i’ , «\n» , $string );


= nl2br ( preg_replace ( ‘#(\\]<1>)(\\s?)\\n#Usi’ , ‘]’ , stripslashes ( $message )));

This one works with br tags having attributes, in any case,
closed or not closed, and does not double linefeeds

* convert br tags to nl
* @param string The string to convert
* @return string The converted string

function br2nl ( $string )
return preg_replace ( «/
]*>\s*\r*\n*/is» , «\n» , $string );

I combine this with strip_tags() for dead simple «contenteditable» fields allowing only text and linefeeds.

Starting from PHP 4.3.10 and PHP 5.0.2, this should be the most correct way to replace
tags with newlines and carriage returns.
* Convert BR tags to newlines and carriage returns.
* @param string The string to convert
* @return string The converted string
function br2nl ( $string )
return preg_replace ( ‘/\
/i’ , PHP_EOL , $string );
(Please note this is a minor edit of this function: )

You might also want to be «platform specific», and therefore this function might be of some help:
* Convert BR tags to newlines and carriage returns.
* @param string The string to convert
* @param string The string to use as line separator
* @return string The converted string
function br2nl ( $string , $separator = PHP_EOL )
$separator = in_array ( $separator , array( «\n» , «\r» , «\r\n» , «\n\r» , chr ( 30 ), chr ( 155 ), PHP_EOL )) ? $separator : PHP_EOL ; // Checks if provided $separator is valid.
return preg_replace ( ‘/\
/i’ , $separator , $string );

I test empirically this function nl2br and nl2br2 (create by ngkongs at gmail dot com).
Both work nice with different ASCII chars for linebreak, but the function nl2br2 is faster than nl2br.

0.0000309944153 s

The function nl2br2:
function nl2br2 ( $string ) <
$string = str_replace (array( «\r\n» , «\r» , «\n» ), «
» , $string );
return $string ;

This is example with «\R» regex token which matches any unicode newline character.
«u» flag treate strings as UTF-16. Which is optional, depending on your use case.

public function nl2br ( $string )
return preg_replace ( ‘/\R/u’ , ‘
‘ , $string );


preg_replace versions are much slower than using str_replace version or built-in nl2br.
Check out pcre.backtrack_limit php.ini setting for information about PCRE limit. It’s good to know.

Some PHP7 benchmarks:
// nl2br()

function nl2br_str ( $string ) <
return str_replace ([ «\r\n» , «\r» , «\n» ], ‘
‘ , $string );

function nl2br_preg_R ( $string )
return preg_replace ( ‘/\R/u’ , ‘
‘ , $string );

function nl2br_preg_rnnr ( $string )
return preg_replace ( ‘/(\r\n|\n|\r)/’ , ‘
‘ , $string );


# nl2br
## Time: 0.02895712852478 s

# nl2br_str
## Time: 0.027923107147217 s

# nl2br_preg_R
## Time: 0.13350105285645 s

# nl2br_preg_rnnr
## Time: 0.14213299751282 s

I just spent a whole day trying to figure out why my textarea $_POST was not getting
tags added by nl2br(). So for others

( INPUT_POST , ‘text’ , FILTER_SANITIZE_SPECIAL_CHARS ); ?> returns newlines as and so nl2br will miss them.

rather use ( INPUT_POST , ‘text’ , FILTER_SANITIZE_STRING ); ?> and newlines will remain intact so nl2br will pick them up.

If you write code that is to run in browser AND on the shell, this function could be useful. It uses PHP_EOL or
depending on the platform it runs:

function nl ( $string ) <
if(isset( $_SERVER [ ‘SHELL’ ])) return preg_replace ( ‘/\
/i’ , PHP_EOL , $string );
return nl2br ( $string );

print nl ( «One\nTwo
Six» . PHP_EOL );

double quotes !== single quotes

php > echo nl2br(‘\r\n’);
php > echo nl2br(«\r\n»);

HTML: Перенос строки

В ходе создания HTML-документа может возникнуть необходимость переноса строки внутри абзаца: например, при размещении отрывка из стихотворения каждая фраза должна начинаться с новой строки.

Обратите внимание, что вы не сможете изменить вид отображения текста на странице с помощью добавления в код дополнительных пробелов или переносов строки. Любое количество пробелов и переносов строк будет считаться как один пробел, так как браузер будет автоматически удалять все лишние пробелы и переносы строк, в этом случае браузер отобразит отрывок стихотворения в виде одного предложения:

В таких случаях самым лучшим выходом из ситуации будет использование тега
(вставляет перенос строки). Он является одним из пустых элементов, у которых нет содержимого. Пустые теги, такие как br, изначально не имеют никакого содержимого, поэтому для их использования было придумано краткое описание для представления элемента, то есть в то место, где нужно добавить разрыв строки, просто подставляется тег
. Краткое описание подразумевает то, что этот тег не имеет закрывающего тега. Если не было бы краткого описания, пришлось бы каждый раз для обозначения разрыва строки писать
, а разве это было бы удобнее?!

Примите во внимание, что краткое описание придумано и используется не из-за лени, а для повышения эффективности, за счет более легкого чтения кода. И в самом деле, спустя некоторое время, проведенное за чтением HTML-кода, вы увидите, что такие элементы легче воспринимаются и запоминаются.

Для переноса текста на несколько строк тег
ставится соответствующее количество раз.

Перенос строки в html

HTML-оформление постов и страниц очень важное дело — оно помогает оформлять контент таким способом, чтобы пользователю было удобно его читать.

Я расскажу вам о теге br — он делает перенос строки в HTML, то есть разбивает строку на две части — причем делает это принудительно, заканчивая текущую строку в том месте, где был вставлен и перенося ее вторую часть на новый ряд.

Где используется этот тег, когда конкретно возникает неотложна необходимость вставить в текст перевод строки без создания нового абзаца? Например, это может пригодиться в оформлении контента — если у вас есть сайт со стихами и отрывками стихов, текстами песен или чем-то подобным.

Все о теге для переноса строки br

Тег br осуществляет одинарный перенос строки в HTML (что это такое описано тут) и определяется всеми браузерами. Да, чуть не забыл — если вы используете тег br, то в отличие от тега абзаца p, у вас не добавляется пустой отступ (перед строкой).

Тег br является пустым (пустой значит без содержимого, ничего не содержит), а значит его не нужно закрывать. А так как его не нужно закрывать, было придумано краткое описание — оно изначально подразумевает то, что сам тег не имеет закрывающего тега.

Представьте на минуту, что не было бы краткого описания. Что тогда? Тогда пришлось бы каждый раз «закрывать и открывать» перенос строки примерно так:
. Это как минимум неудобно. Но, тем не менее, в строгом XHTML закрывать его обязательно тегом

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

Чтобы осуществить перенос следующего предложения на новую строку, используем тег br.

Ура, второе предложение на новой строке.

Ночь, улица, фонарь, аптека,
Бессмысленный и тусклый свет.
Живи еще хоть четверть века —
Все будет так. Исхода нет.

Умрешь — начнешь опять сначала
И повторится все, как встарь:
Ночь, ледяная рябь канала,
Аптека, улица, фонарь.

Зачем придумали тег br?

Необходимость этого тега существует хотя бы потому что перенести строку «как в Ворде» (как делают неопытные пользователи), путем написания десятков пробелов подряд, — не выйдет.

Почему не выйдет? Потому что любое количество пробелов будет считаться браузером как один пробел, а не перенос строки — браузер автоматически удаляет лишние пробелы. Для этого и нужен перенос строк.

Но не стоит злоупотреблять тегом
, чтобы все больше и больше увеличивать расстояние между строками — для этого лучше всего воспользоваться базовыми инструментами HTML+CSS. Недопустимо создание новых абзацев или «как бы абзацев» (это считается плохим подходом) — только перенос строки!

Чтобы создавать и размечать абзацы вам следует пользоваться тегом p, а чтобы увеличить имеющееся расстояние между абзацами — измените каскадные таблицы стилей, например добавьте:

Бонус — br clear

А как сделать так чтобы текст, в котором вы поставили перенос строки, не обтекал плавающий элемент (это либо изображение с установленным align, либо элемент со свойством float), а начинался ниже элемента? Для этого можно использовать атрибут clear.

Допустим, у нас есть изображение выровненное по левому краю (align=»left»). Если мы установим
, то текст после тега
(следующая строка, которую мы и переносим) будет отображаться как надо, ниже рисунка. Другие значения атрибута clear тега
сделают так, чтобы текст обтекал рисунок, расположившись справа от него.

Использование этого специфичного атрибута не приветствуется спецификацией HTML — такой код будет невалидным.

БОНУС — тег-разделитель hr

Тег тоже одиночный, но, в отличие от
, он используется для создания горизонтального разделителя в виде линии. Более того, внешний вид этой линии мы можем задавать при помощи атрибутов. Но, конечно же, лучше это делать проверенными методами через CSS (что это такое, читайте здесь).

БОНУС — запрет переноса на новую строку с тегом nobr

Бывает и так, что мы хотим запретит перенос строки и избежать перевода на новую строку текста: либо между двумя конкретными словами, либо в целом абзаце. Что делать? Использовать тег . Как выглядит на практике? Вот так:

Что делает тег ? Он говорит браузеру — отображай текст внутри тега без переносов, одной строкой. И, если текст длинный, тогда у нас появится некрасивая и длинная горизонтальная полоса прокрутки, а пользователи должны будут прокрутить текст по горизонтали, чтобы прочитать его полностью.

Как мы понимаем, это очень неудобно. Но тег есть!

Итоги — использование br, nobr, hr, p в HTML

Подводя итог, резюмирую содержание статьи:

— для того чтобы разделять абзацы

  • тег
    — для того чтобы перенести строку внутри абзаца (недопустимо «создание абзацев» при помощи этого тега или злоупотребление им)
  • тег — для создания горизонтальной линии-разделителя
  • тег — для запрета переноса строк в HTML
  • Проблемы с переносом строки в textarea

    Наверняка я буду не первым и не последним из тех, кто сталкивался, по неграмотности, с проблемой переноса строк в textarea при записи содержимого в MySQL-базу — все символы переноса строки остаются незамеченными и в базу попадает, по сути, одна большая строка.

    Обратившись к великому Гуглу, наковырял, так сказать, изюма из булок — ну и выкладываю засим…

    Способ первый (а вдруг повезет):

    Как гласит спецификация HTML (поправьте меня, гуру, при ошибке в терминологии), у поля TEXTAREA имеется замечательный атрибут — WRAP, который определяет способ переноса слов в заполняемой данной заполняемой форме. Возможные значения:

    • off — перенос слов не происходит (значение по умолчанию)
    • virtual — перенос слов только отображается, на сервер же поступает неделимая строка.
    • physical — перенос слов будет происходить во всех точках переноса.

    Вот, кажется, и панацея нашлась:

    Применив на практике сие чудо мысли, заметил, что оно НЕ РАБОТАЕТ. Видимо, по незнанию перепутал переносы слов и строк �� Так вот, данная фича относится именно к переносу слов и никак иначе…

    Способ второй. Рабочий.

    Так как работаем с базой на языке php (ну, там, селекты, апдейты), то неглупым было бы использовать обычную стандартную функцию языка — nl2br, которая вставляет HTML код разрыва строки перед каждым переводом строки. Делается это приблизительно так:

    Естественно, безо всяких мудрствований с дизайном, это уже делайте исходя из собственных соображений. А вот фрагмент файла add.php, куда мы отправляем данные из нашей формы методом POST:

    Вот так уже работает. Но есть одно но. Не всех устроит обычный перенос строки, так как не каждому понравится отсутствие интервала между абзацами, поэтому применяем

    Способ третий. Доработка напильником.


    В языке PHP существует стандартная функция br2nl, которая преобразовывает переносы строк в HTML-тег переноса строки (
    ). Провернуть обратную операцию достаточно просто с помощью регулярных выражений, однако тут есть одна маленькая хитрость.

    Дело в том, что функция nl2br не заменяет переносы строк на тег
    , а добавляет этот тег к переносу строки. Таким образом, если например при редактировании материала вы преобразуете переносы в тег с помощью nl2br, а затем при его отображении в другом скрипте выполняете обратную операцию — то переносов будет уже два. Поэтому предлагаемая мною функция не только ЗАМЕНЯЕТ HTML-теги
    на символы переноса строки, но и удаляет уже существующие переносы, чтобы исключить дублирование. Функция обрабатывает как теги
    так и
    function br2nl($str) <
    $str = preg_replace(«/(rn|n|r)/», «», $str);
    return preg_replace(«=
    =i», «n», $str);

    2 мысли о “PHP: br2nl или преобразование тегов
    в переносы строк”

    Не работает. Так работает:

    function br2nl($str)
    $str = preg_replace(«/(\n|\r)/», «», $str);
    return preg_replace(«//i», «\r\n», $str);

    PHP заменить двойной разрыв строки с

    У меня есть textarea поле , где я позволить пользователям вводить в виде простого текста или HTML.

    Я очистить HTML с помощью HTMLPurify, но я хочу , чтобы добавить функцию , чтобы помочь пользователям , которые не знают HTML (и , таким образом , использовать обычный текст): преобразовать разрывы двойной линии ( \n\n , \r\r , \n\r , \r\n ) в
    . Если есть 2 пары разрывов двойных линий, поверните его на 2
    сек, и т.д.

    Превратится в это:

    Использование nl2br() вызывали проблемы в том , что он сделал с помощью HTML трудно, например ..

    Был превращен в

    в результате чего там быть дополнительные пункты пули, когда не должно быть.

    Это может быть HTMLPurify, вместо того, чтобы попытаться strip_tags () и использовать nl2br (), если это работает, то это deffinitely HTMLPurify, что является причиной проблемы.

    Вы также можете попробовать nl2br () перед использованием HTMLPurify, таким образом вы превратили все \n\r в
    перед HTMLPurify и уважать

    Я нашел решение некоторое время назад, и теперь я отвечаю на мой вопрос. HTMLPurify имеет опцию для «Авто абзацев»

    nl2br — Вставляет HTML код разрыва строки перед каждым переводом строки

    Возвращает строку с «
    » или «»
    вставленной перед всеми символами новой строки (\ г \ п \ п \ г \ п и \ г).

    Способы переноса строк в PHP

    Во многих учебниках php при разговоре о переносе строк часто приводят следующий код в качестве примера.

    Спец-символ \n говорит о сдвиге курсора вниз, т.е. о переводе строки. Однако запустив приведенный выше код мы получим, то, что изображено на скриншоте снизу, а именно никакого перевода не будет и текст расположиться в одну строку.

    Почему так спросите вы? Как браузер осмелился меня ослушаться? Тут все очень просто, для браузера важны теги, и для разрыва строк используется тег

    Проще говоря, данный символ отработал в php и в исходном коде страницы перенос есть, достаточно нажать ctrl+u и посмотреть исходный код страницы. Там мы увидим, что все верно и перенос есть.

    Мы можем приказать браузеру выводить информацию так как есть, сохраняя все пробелы и переводы строк. Для этого обернем код в тег

    Так же можно использовать html тег
    или использовать кросплатформенную константу PHP_EOL однако так же только в теге pre , для
    pre уже не нужен.

    И навреное последний способ это прогнать строку с символами разделителями типа \n \r и тд. через функцию nl2br() которая вернет строку с замененными символами переноса на тег

    Создание сайта на WordPress

    Что как и почему в WordPress

    Многострочный текст в php-сценарии

    Когда php-сценарий должен выводить многострочный текст из элемента формы

    (или из текстового файла), возникает проблема реализации перехода на новую строку. Кроме того, оказывается, что при пересылке из формы кавычки в тексте автоматически экранируются, т.е. к каждой кавычке добавляется слэш. Это значит, что в настройках сервера, на котором работает php-сценарий, включены «магические кавычки» (magic_quotes). Решаем эти проблемы:
    Как выполняется переход на новую строку
    Отображение многострочного текста в браузере
    — Получение массива строк исходного текста
    — Использование функции nl2br
    — Нумерация строк
    Как устранить экранирование

    Как выполняется переход на новую строку

    В текстовом файле или в многострочном текстовом поле формы строки отделяются специальными управляющими символами n и/или r (в зависимости от операционной системы): в Windows это rn, в Unix — n, а в MacOX — nr.
    А в браузере (текст с html-разметкой) переход на новую строку (разрыв строки) — это тег

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

    Отображение многострочного текста в браузере

    Допустим, нужно показать в браузере исходный текст, который может содержать html-разметку.Это может быть текст с примерами html-кода.

    Получение массива строк исходного текста

    Текстовый файл может быть прочитан сразу как массив (список) отдельных строк, например, с помощью функции file(). Но из поля формы

    текст передается в сценарий как одна строка, в которой присутствуют управляющие символы перехода на новую строку. Сначала разделим текст на строки с использованием регулярного выражения, а потом выведем эти строки с нужным разделителем. Массив $lines содержит отдельные строки исходного текста $text, в котором специальные html-символы заменены их эквивалентами (функция htmlspecialchars), чтобы они не интерпретировались браузером, а отображались «как есть»:

    Аналогично работает php-функция nl2br, которая вставляет разрыв строки ‘
    ‘ (xhtml, по умолчанию) или ‘
    ‘ перед каждой новой строкой.

    Использование функции nl2br

    string nl2br ( string $string [, bool $is_xhtml = true ] )

    Если функция htmlspecialchars не используется, а в исходном тексте есть тег

    добавление функцией nl2br тегов разрыва строки приведет к появлению пустых строк, и сами теги

    Нумерация строк

    Первый из приведенных способов, когда создается массив строк текста (например, с использованием регулярного выражения), является более гибким. Полученные отдельные строки можно помещать внутрь таких тегов, как

    или нумерованный список:

    Как устранить экранирование

    «Волшебные кавычки» (magic_quotes) используются в PHP из соображений безопасности. Когда экранирование добавляется автоматически (к одинарным и двойным кавычкам, обратным слэшам () и NUL), не нужно добавлять слэши функцией addslashes() во всех запросах Get, Post и Cookie. Но, к сожалению, при этом экранирование появляется и там, где это не нужно. Удалить ненужные слэши из строки позволяет функция stripslashes(). Но можно и «отключить» экранирование на время выполнения сценария, добавив в начале:

    или, если есть такая возможность, можно добавить в файл .htaccess сайта:

    HTML перенос строки

    указывает место переноса строки в тексте HTML страницы. Тег br ставится перед местом конца строки, текст после тега будет выведен с новой строки.

    Стоит отметить, что тег
    устанавливает границу между строками (означает разрыв строки), а не делит текст на абзацы. Чтобы определить абзацы в тексте HTML документа используйте тег


    Отображение в браузере

    В примере далее использован разрыв строк

    Илон Маск рекомендует:  $LongStrings - Директива компилятора Delphi
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL