Як я можу замінити рядок або \ r \ n на <br/>?


76

Я намагаюся просто замінити кілька нових рядків і спробував три різні способи, але я не отримую жодних змін:

$description = preg_replace('/\r?\n|\r/', '<br/>', $description);
$description = str_replace(array("\r\n", "\r", "\n"), "<br/>", $description);
$description = nl2br($description);

Це все повинно працювати, але я все ще отримую нові рядки. Вони подвійні: "\ r \ r". Це не повинно змусити жодного з цих невдач, правда?


1
Чому у вас голі \rпереривання? AFAIK навіть MacOSX перейшов на \n.
ThiefMaster

Вони надходять із CSV клієнта.
theflowersoftime

Відповіді:


134

Уже є nl2br()функція, яка вставляє <br> теги перед символами нових рядків:

Приклад ( кодова панель ):

<?php
// Won't work
$desc = 'Line one\nline two';
// Should work
$desc2 = "Line one\nline two";

echo nl2br($desc);
echo '<br/>';
echo nl2br($desc2);
?>

Але якщо це все ще не працює, переконайтесь, що текст $desciptionподвійне цитування.

Це тому, що одинарні лапки не `` розширюють '' екранні послідовності, такі як \nпорівняння з подвійними лапками . Цитата з документації PHP:

Примітка : На відміну від синтаксисів із подвійними лапками та heredoc, змінні та послідовності екранування для спеціальних символів не будуть розширені, коли вони трапляються в рядках з одинарними лапками.


Подивіться ближче, він ОП конкретно показує, що вони намагалися використати, nl2brі що це не спрацювало.
Тім Бієлава,

Просто спробував запустити nl2br на рядку з подвійними поверненнями каретки, і це спрацювало нормально.
Децько

1
Подивіться на мою редакцію @ThomasMcCabe. Я додав (можливо) корисну інформацію.
Робік

21
Будь ласка , зверніть увагу , що nl2brце не замінює , але замість того, щоб ВСТАВКИ до символу нового рядка, які ВИХОДЯТЬ НЛ символи і додають бри перед ними.
Брок Хенслі,

але якщо у нас є файл із розривами рядків і ми хочемо прочитати його за допомогою PHP-сценарію та інтерпретувати ці рядки розриву, як це зробити?
user3911183


17

У вас можуть бути справжні символи "\" у рядку (рядки з одинарними лапками, як сказав @Robik).

Якщо ви впевнені, що також слід замінити рядки '\ r' або '\ n', я тут не говорю про спеціальні символи, а про послідовність двох символів '\' та 'r', тоді уникніть '\ 'у рядку заміни, і це буде працювати:

str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),"<br/>",$description);

nl2br - це добре, але це насправді працює (для мого json-матеріалу), дякую!
Вальмонд

6

nl2br() як у вас це має працювати нормально:

$description = nl2br($description);

Більш імовірно, що незакритий 'у першому рядку вашого прикладу код викликає вашу проблему. Видаліть опис 'after $ ...

...$description');

6

Спробуйте це:

echo str_replace(array('\r\n', '\n\r', '\n', '\r'), '<br>', $description);

3
Прочитайте про рядки PHP . '\r\n'не те саме, що "\r\n".
axiac

Дякую @axiac, у мене немає часу на тестування, але ти маєш на увазі, що це має бути щось на зразок "\r\n"правильно?
l2aelba

3

Це точно спрацює:

str_replace("\\r", "<br />", $description); 
str_replace("\\n", "<br />", $description); 

Абсолютно неправильна пропозиція. "foo \\ r \\ nbar" стане "foobar" замість "foo <br/> bar". До заміни html відображає "foo bar".
Artemix

Ме Працює для деяких конкретних випадків, коли вхідні дані мають відомий формат.
evandentremont

3

nl2br () працював у мене, але мені потрібно було обернути змінну подвійними лапками:

Це працює:

$description = nl2br("$description");

Це не працює:

$description = nl2br($description);

Яке пояснення?
Пітер Мортенсен,



-3

Якщо ви використовуєте nl2br, всі випадки \nта \rбудуть замінені на <br>. Але якщо (я не знаю, як це) ви все одно отримуєте нові рядки, якими ви можете скористатися

str_replace("\r","",$description);
str_replace("\n","",$description);

щоб замінити непотрібні нові рядки порожнім рядком.


\rв, str_replaceздається, замінює все. І, крім того, вам слід замінити його на <br>...
Віллем Ван Онсем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.