Як видалити з рядка розриви рядків (без символів!)?


146

Це може здатися дурпом, але будьте впевнені, що це не так - я шукав відповіді на свою проблему як в іншому, так і в решті Інтернету, і в кінцевому підсумку знаходжу ті самі недостатні «рішення» знову і знову. Як би там не було:

Я зберігаю дані користувача з текстової області в базі даних 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_replace( "/\r|\n/", "", $yourString );

Навіть незважаючи на те, що \nсимволи не з’являються, якщо ви отримуєте повернення каретки, там є невидимий символ. Замінювач preg повинен схопити та виправити їх.


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

3
Зауважте, що це не відповідає всім розривам рядків, тобто тим, які створені в системах Windows. Щоб зловити їх, ви можете скористатися наступним RegEx натомість/\r|\n|\r\n/
Toastrackenigma

6
використання \ R (який представляє будь-яку послідовність закінчення рядка) stackoverflow.com/a/16274784/1491212
Армель Ларсьє

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

Ця функція повертає рядок з пробілом, позбавленим від початку та кінця str. Без другого параметра, 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.
Аджая

Ну, я використовую цю функцію, щоб замінити розриви рядків комами, тому адреса є текстом одного рядка, тому заміна \r\nПЕРШОГО допоможе, оскільки це означає одну кому, а не дві для кожної частини, якщо цей розрив рядка
Мартін

@Martin Так, ти маєш рацію, я просто зрозумів те саме, тому ми замінюємо \r\nспочатку, потім ми замінюємо, \rі \nя відредагував свою відповідь.
Аджая

Це все-таки зайве, якщо ви збираєтесь видалити всі, \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  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.