Как удалить разрывы строк (без символов!) Из строки?


146

Это может показаться обманом, но будьте уверены, что это не так - я искал как SO, так и остальную часть Интернета, чтобы найти ответ на мою проблему, и в итоге снова и снова находил одни и те же недостаточные «решения». Во всяком случае, здесь это идет:

Я сохраняю пользовательский ввод из текстовой области в базу данных MySQL (в среде WordPress, но я считаю, что это не должно иметь значения для этой проблемы). Позже он извлекается из БД для показа администраторам в серверной части сайта. Проблема возникает, когда пользователи отправляют текст с разрывами строк (т.е. нажимают клавишу Enter).

Пример строки может выглядеть так:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

В строке нет символов конца строки ("\ n", "\ r" и т. П.).

Я использую nl2br()его для генерации вывода HTML, но этого недостаточно. Результат тогда:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

Что, насколько я понимаю, является ожидаемым nl2br() результат, поскольку он вставляет теги и не должен заменять разрывы строк?

Однако формат, который мне нужен, будет следующим:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Если строка имела символы EOL , такие как «\ п» в нем, я бы ударил его либо str_replace()или preg_replace()и сделать с ней, но я понятия не имею , какие иглы для подачи либо из этих функций , если там нет ни одного символа там в первую очередь.

Я могу вручную получить доступ к соответствующему полю в БД, нажимать клавишу Backspace для каждого перехода на новую строку, и то, что я позже хочу сделать со строкой, работает. Так что я знаю, что мне нужен вышеуказанный формат.


Если строка выглядит как ваш первый пример, то как вы можете сказать, что в ней нет символов разрыва строки? У него есть как минимум два: два подряд после "спасибо!"
Эрнест Фридман-Хилл

Честно говоря, @ ErnestFriedman-Hill, вы, очевидно, правы - там есть «что-то», просто ничего не видно и ничего, что я знаю.
Йоханнес Пилле

Я также не вижу, как можно иметь новые строки без символов разрыва строки. Можете ли вы использовать шестнадцатеричный редактор для проверки строки - я уверен, что вы найдете символы для новых строк ...
крапива

Ответы:


376

Вы должны иметь возможность заменить его на preg, который удаляет все переводы строки и возврат каретки. Код является:

preg_replace( "/\r|\n/", "", $yourString );

Даже если \nсимволы не появляются, если вы получаете возврат каретки, там есть невидимый символ. Замена preg должна захватить и исправить это.


Невероятно. Я мог бы поклясться, что попробовал все в соответствии с вашими и @bsdnoobz ответами, которые оба выполняют свою работу. Ну и ладно, какой бы ментальный блок у меня там не был, вы оба сэкономили мне кучу времени. Думаю, это был довольно глупый вопрос. Спасибо, парни!
Йоханнес Пилле

3
Обратите внимание, что это не будет соответствовать всем разрывам строк, то есть тем, которые созданы в системах Windows. Чтобы поймать их, вместо этого вы можете использовать следующий /\r|\n|\r\n/
RegEx

6
используйте \ R (который представляет собой любую последовательность конца строки) stackoverflow.com/a/16274784/1491212
Armel Larcier

435

Решение Бена приемлемо, но str_replace () намного быстрее, чем preg_replace ()

$buffer = str_replace(array("\r", "\n"), '', $buffer);

Использование меньшей мощности процессора снижает выбросы углекислого газа в мире.


5
Не могу поверить, что этот ответ не заслуживает большего доверия. 100 больших пальцев до этого за preg_replace ()
pimbrouwers

62
ВАЖНО: Используйте ДВОЙНЫЕ ЦИТАТЫ вокруг кодов возврата каретки и новой строки. Они не будут обработаны правильно, если вы используете одинарные кавычки!
Брайт

47
Недурно -> «Использование меньшей мощности процессора снижает выбросы углекислого газа в мире».
января

3
@Joeri: Этот последний никогда не будет вызван, так как он будет обработан первыми двумя. Это избыточный код.
nightfox89

4
@Joeri Учитывая, что str_replace удаляет все вхождения, разве \ r и \ n оба ВСЕХ будут удалены в любом случае?
Брэм Ванрой

16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line

11

Это потому, nl2br()что не удаляет новые строки вообще.

Возвращает строку с <br />или <br> вставленные прежде , чем все переводы строк ( \r\n, \n\r, \nи \r).

Используйте str_replaceвместо:

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

7

Вы также можете использовать PHP Trim

Эта функция возвращает строку с пробелами, удаленными из начала и конца строки. Без второго параметра trim () удалит эти символы:

  • «» (ASCII 32 (0x20)), обычное пространство.
  • "\ t" (ASCII 9 (0x09)), вкладка.
  • «\ n» (ASCII 10 (0x0A)), новая строка (перевод строки).
  • «\ r» (ASCII 13 (0x0D)), возврат каретки.
  • «\ 0» (ASCII 0 (0x00)), NUL-байт.
  • «\ x0B» (ASCII 11 (0x0B)), вертикальная табуляция.

3
Это будет предназначаться только для новых строк в начале и конце строки. Новые строки в середине строки не будут затронуты.
mickmackusa

6

Для правильной работы также на Windows я бы предложил использовать

$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);

"\r\n"- для Windows, "\r"- для Mac и "\n"- для Linux


2
Извините, приятель, но даже будучи тем, кого спрашивали в 12 году, я могу с полной уверенностью сказать, что это излишне. Задайте себе следующие вопросы: Если все \rи все \nони удалены в строке, почему бы это не иметь место для тех, кто следует друг за другом напрямую?
Йоханнес Пилле

На самом деле, эта очевидная вещь не пришла мне в голову ... Спасибо :) Я только что понял, что у меня были проблемы с этим, но это было наоборот, я использовал \r\nв Windows, и она не работала в Linux.
Ajjaah

Что ж, я использую эту функцию для замены разрывов строк запятыми, чтобы адрес представлял собой однострочный текст, поэтому замена \r\nFIRST помогла бы, поскольку это означает одну запятую, а не две для каждой части, если этот разрыв строки
Martin

@ Мартин Да, вы правы, я только что понял то же самое, поэтому мы \r\nсначала заменим , потом заменим, \rи \nя отредактировал свой ответ.
Ajjaah

Это все еще излишне, если вы собираетесь удалить все \rи \r, нет необходимости удалять \r\n, вы можете str_replace(array("\r","\n"), "", $buffer);получить тот же результат.
страмин

6

str_replace (PHP_EOL, null, $ str);


1
Хотя это может ответить на вопрос. Рекомендуется объяснить немного о вашем ответе.
Анирудх Шарма

PHP_EOL не всегда работает, когда вы читаете строку. Это когда вы их пишете.
nightfox89

Ответы только на код имеют низкую ценность в StackOverflow, потому что они очень мало делают для обучения ОП и будущих читателей.
mickmackusa

4

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

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

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


1

Альтернативный встроенный: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Это там, чтобы удалить разрывы строк из различных видов текстовых файлов, но не обрабатывает HTML.


0

Я использую 3 строки для этой работы, поэтому считаю $ s своим "материалом" ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.