как удалить новые строки и возвраты из строки php?

Переменная php содержит следующую строку:

<p>text</p>
<p>text2</p>
<ul>
<li>item1</li>
<li>item2</li>
</ul>

Я хочу удалить все символы новой строки в этой строке, чтобы строка выглядела так:

<p>text</p><p>text2><ul><li>item1</li><li>item2</li></ul>

Я безуспешно пробовал следующее:

str_replace('\n', '', $str);
str_replace('\r', '', $str);
str_replace('\r\n\', '', $str);

Кто-нибудь знает, как это исправить?


person Yens    schedule 21.10.2010    source источник
comment
Вам могут быть полезны s($str)->normalizeLineEndings(''), как в этой отдельной библиотеке. Он удаляет все типы новых строк, включая символы Unicode.   -  person caw    schedule 27.07.2016
comment
Просто используйте " вместо '.   -  person Nabi K.A.Z.    schedule 17.06.2019


Ответы (9)


Вам нужно поместить \n в двойные кавычки.
Внутри одинарных кавычек он обрабатывается как 2 символа '\', за которыми следует 'n'

Тебе нужно:

$str = str_replace("\n", '', $str);

Лучшей альтернативой является использование PHP_EOL как:

$str = str_replace(PHP_EOL, '', $str);
person codaddict    schedule 21.10.2010
comment
PHP_EOL действительно не работает. PHP не найдет их правильно в str_replace. Я должен сделать это для правильного отображения html: заменить \r\n на ‹br› (это для CRLF под Windows), затем заменить \n на ‹br›(это для LF под Linux), наконец, заменить \r с пустой строкой (это ничего не должно значить) - person Scott Chu; 09.07.2015
comment
Да в двойных кавычках. Нет для PHP_EOL, как описано выше. - person Paolo; 01.02.2017
comment
Действительно, PHP_EOL не работает. Вместо этого должно быть ["\r\n", "\r", "\n"]. - person Matt K; 02.02.2017
comment
Я потратил много времени, пытаясь отладить свой код из-за этой проблемы. Спасибо! - person Bhargav Nanekalva; 23.02.2017
comment
Вам действительно нужно "\r\n" в ["\r\n", "\r", "\n"]? Он уже собирается глобально удалить \r и \n` везде, верно? - person James M. Lay; 10.12.2017
comment
FWIW, в PHP 7 я смог использовать $str = str_replace(PHP_EOL, '', $str);, и это успешно сработало. - person JustCarty; 11.12.2017
comment
@JustCarty Это могло сработать в вашем конкретном случае, но предполагается, что значение $str было создано на той же платформе, что и система, на которой запущен скрипт. Если вы смешаете Windows и Unix, у вас будет плохой день. - person musicin3d; 17.03.2018
comment
@musicin3d Я знаю, что это старо, но, наверное, я просто хочу знать, почему все ругают его ответ за использование константы php, когда единственная ссылка, которую мы имеем, - это среда php. Я понимаю, что \r\n будет охватывать больше случаев, но вы все на своем высоком коне, не рассматривая \025 для IBM... Я все еще думаю, что PHP_EOL - лучший ответ в этом контексте, потому что предполагаемая потребность в \r\n основывается на предположении. Я предполагаю, что именно поэтому репутация codaddict примерно в 100 или более раз выше, чем у всех остальных в этих комментариях. Но я сам нуб... может он через 8 лет передумал? Надеюсь, он взвешивается - person TCooper; 17.10.2018
comment
@TCCooper Как и во всем, это действительно зависит от того, какие предположения вы можете сделать на самом деле. Где будет работать приложение и откуда будут поступать входные данные (например, файл, база данных и т. д.)? Если он когда-либо будет работать только на одной архитектуре, и вы знаете, на какой, вы можете обойтись без использования родного символа возврата. Если приложение будет работать на одной арке и та же арка создала/создает ввод, вам следует использовать PHP_EOL. Однако, если вы не можете гарантировать, где он будет запущен или какая арка создала входные данные, вам лучше быть готовым к обработке возвращаемых символов, изначально не поддерживаемых на всех возможных архитектурах. - person musicin3d; 18.10.2018
comment
@TCooper Например, что, если вы используете Linux, ваш товарищ по команде использует Mac, а ваш тестер использует Windows? Что происходит, когда вы копируете базу данных одного человека в другую? Что произойдет, если вы перенесете свое приложение, написанное на кроссплатформенном языке, на другую платформу? - person musicin3d; 18.10.2018

Вы должны обернуть \n или \r в "", а не ''. При использовании одинарных кавычек escape-последовательности не будут интерпретироваться (кроме \' и \\).

В руководстве указано:

Если строка заключена в двойные кавычки (), PHP будет интерпретировать дополнительные управляющие последовательности для специальных символов:

  • \n перевод строки (LF или 0x0A (10) в ASCII)

  • \r возврат каретки (CR или 0x0D (13) в ASCII)\

  • (...)

person kapa    schedule 21.10.2010
comment
Это важно. Раньше я использовал одинарную кавычку ', а текст всегда заменялся на "\n" (тип строки). Если вы путаете с этим, имейте это в виду.... - person Benyi; 04.05.2017

Что-то немного более функциональное (легко использовать где угодно):

function replace_carriage_return($replace, $string)
{
    return str_replace(array("\n\r", "\n", "\r"), $replace, $string);
}

Использование PHP_EOL в качестве параметра замены поиска также является хорошей идеей! Престижность.

person tfont    schedule 11.08.2015
comment
Заимствовано для stackoverflow.com/questions/33850820/ Спасибо! +1 - person Steve; 22.11.2015

Это должно быть похоже

str_replace("\n", '', $str);
str_replace("\r", '', $str);
str_replace("\r\n", '', $str);
person Asif Mulla    schedule 21.10.2010

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

$newstring = preg_replace("/[\n\r]/","",$subject); 
person saravanavelu    schedule 03.06.2015
comment
очень хорошо работает в laravel для удаления новой строки из описания продукта. - person calin24; 15.05.2018

вы можете передать массив строк в str_replace, так что вы можете сделать все в одном выражении:

$content = str_replace(["\r\n", "\n", "\r"], "", $content);
person rvandoni    schedule 20.11.2019

Правильный вывод:

'{"data":[{"id":"1","reason":"hello\\nworld"},{"id":"2","reason":"it\\nworks"}]}'

function json_entities( $data = null )
{           
    //stripslashes
    return str_replace( '\n',"\\"."\\n",
        htmlentities(
            utf8_encode( json_encode( $data)  ) , 
            ENT_QUOTES | ENT_IGNORE, 'UTF-8' 
        )
    );
}
person Jonathan    schedule 27.06.2016
comment
Это даже отдаленно не ответ на этот вопрос. На самом деле, единственное общее в вопросе и ответе — это литерал символа новой строки '\n' и использование str_replace, хотя и для совершенно разных целей. - person Michael Gaskill; 28.06.2016
comment
У вас есть причина, у меня работает, потому что я использую TextArea и иногда мне нужна новая строка, и эти данные отправляются угловым ng-init - person Jonathan; 07.07.2016

Заменить строку:

$str = str_replace("\n", '', $str);

вы используете также как, (%n,%t, все специальные символы, цифры, символы и т. д.)

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

person Alagu Sundar    schedule 17.03.2017

person    schedule
comment
Это удалит его только с попрошайничества и конца строки, а не с середины. - person Dharman; 01.06.2020
comment
Пожалуйста, добавьте некоторое объяснение к вашему ответу, чтобы другие могли извлечь из него уроки. - person Nico Haase; 02.06.2020