Удалить новые строки из строки и заменить их одним пустым пробелом

244
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

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

/\r\n|\r|\n/

$string должен стать:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";
  • 1
    Если вы делаете тысячи замен, избегайте использования preg_replace . Это почти в два раза медленнее, чем str_replace .
  • 0
    Может оказаться полезным s($str)->normalizeLineEndings('') , как это можно найти в этой автономной библиотеке . Это удалит не только LF, CR и CRLF, но и любой перевод строки Unicode.
Теги:
string

18 ответов

462
Лучший ответ

Вы должны быть осторожны в разрыве двойной линии, что приведет к двойным пробелам. Используйте это действительно эффективное регулярное выражение:

$string = trim(preg_replace('/\s\s+/', ' ', $string));

Несколько пробелов и новых строк заменяются одним пробелом.

Изменить: Как указывали другие, это решение имеет проблемы, связанные с одной новой линией между словами. Этого нет в этом примере, но можно легко увидеть, как это может произойти. Альтернативой может быть следующее:

$string = trim(preg_replace('/\s+/', ' ', $string));
  • 8
    Прежде чем использовать это решение, ознакомьтесь с моим ответом ниже и комментариями к моему ответу. Это решение может работать не так, как вы ожидаете.
  • 1
    в регулярном выражении "\ s Соответствует символу пробела", почему он соответствует символу новой строки?
Показать ещё 6 комментариев
153

Несколько комментариев к принятому ответу:

+ означает "1 или более". Я не думаю, что вам нужно повторить \s. Я думаю, вы можете просто написать '/\s+/'.

Кроме того, если вы хотите удалить пробелы сначала и последним в строке, добавьте trim.

С этими изменениями код будет выглядеть следующим образом:

$string = preg_replace('/\s+/', ' ', trim($string));
  • 0
    Ты прав; /\s\s+/ не сможет соответствовать переводу строки в foo\nbar .
  • 2
    Хорошо, чтобы получить подтверждение того, что я прав. Кстати, что означают слова "foo" и "bar"? Я знаю, что они заполнители, но что на самом деле означают слова? И не лучше ли использовать более знакомые слова, которые будут менее запутанными для начинающих, в качестве заполнителей? Когда я впервые увидел «foo» и «bar» в том или ином учебном пособии, я подумал, что слова были кодом, и мне потребовалось некоторое время, чтобы понять, что это не так.
Показать ещё 4 комментария
59

Просто используйте preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

Вы можете уйти с str_replace() на этом, хотя код выглядит не так просто:

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

Смотрите на live ideone

  • 1
    OP хочет пробел между «абзацами» и «для». Если вы просто удалите символы новой строки, их не будет.
  • 2
    первый не работает
Показать ещё 13 комментариев
18
$string = str_replace(array("\n", "\r"), ' ', $string);
  • 2
    Escape-последовательности в PHP должны быть заключены в двойные кавычки.
  • 0
    Это не делает точно то, что хочет ОП, так как это то же самое, что и неуловимый ответ, и оно не удаляет символы \r
Показать ещё 3 комментария
10

Вы должны использовать str_replace для своей скорости и использовать двойные кавычки с массивом

str_replace(array("\r\n","\r"),"",$string);
  • 0
    Мало ресурсов, отлично, ткс.
  • 0
    Я могу ошибаться, но этот код не удаляет символ новой строки в системах Unix, потому что в этих системах новая строка это просто \n а не \r\n более того, я думаю, что OP просит поставить один пробел вместо новых строк
6

Повторная замена PCRE может быть выполнена с использованием preg_replace: http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

Заменит новую строку или возвращает символы пробелом. Если вы не хотите ничего заменить, измените второй аргумент на ''.

  • 1
    Функции preg используют регулярные выражения PCRE, а не POSIX. Есть функции ereg которые используют POSIX, но теперь они устарели.
  • 0
    Ой, хорошая мысль, извините! Исправляем сейчас.
4

Последовательность побега \R соответствует общей строке новой строки

то есть все, что считается последовательностью строк в Unicode. Сюда входят все символы, совпадающие с \v (вертикальные пробелы) и \x0D\x0A последовательность \x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

В 8-битном режиме без UTF-8 \R эквивалентно следующему: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Демо-версия Regex101

  • 0
    Антон, пожалуйста, проверьте, все ли в порядке! Добавлена дополнительная информация.
3

Используйте это:

замените строку строк новой строки пустой строкой:

$string = preg_replace("/[\\n\\r]+/", "", $string);

или вы, вероятно, захотите заменить новые строки одним пространством:

$string = preg_replace("/[\\n\\r]+/", " ", $string);
  • 0
    Пожалуйста, отформатируйте ваш код правильно. Это делается путем выделения соответствующей строки четырьмя пробелами.
  • 2
    Вот почему я использую одинарные кавычки, поэтому мне не нужно экранировать эти символы. \\n выглядит ужасно. \\\\ совпадать с одним обратным слешем просто ужасно.
2

возможно, это работает:

$str='\n';
echo str_replace('\n','',$str);
2

Что о:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

Это должно быть довольно надежное решение, потому что \n не работает корректно во всех системах, если я не ошибаюсь...

2

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

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
str_replace($searches, "", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);
1

Разрывы строк в тексте обычно представлены как:

\ r\n - на компьютере с Windows

\ r - на компьютере Apple

\n - в Linux

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);
1

Вы можете попробовать под кодом сохранить в тексте любые пробелы и новые строки.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );
1

Это также удаляет вкладки

$string = preg_replace('~[\r\n\t]+~', '', $text);
1

это шаблон, который я использовал бы

$string = preg_replace('@[\s]{2,}@',' ',$string);
0

Я решаю свою проблему, используя код ниже

$ string = preg_replace ('~ [\ r\n] + ~', '', $ string);

0

этот ниже код работает весь текст, пожалуйста, используйте его:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);
0

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

Сброс новых строк в php

$str = preg_replace('/\r?\n$/', ' ', $str);

В perl

$str =~ s/\r?\n$/ /g;

Значение замены любого символа новой строки в конце строки (для эффективности) - необязательно предшествует возврат каретки - с пробелом.

\n или \015 - новая строка. \ r или \012 - возврат каретки. ? в regex означает совпадение 1 или ноль предыдущего символа. $ в регулярном выражении означает конец конца строки.

Оригинальная и лучшая ссылка regex - perldoc perlre, каждый кодер должен хорошо знать этот документ: http://perldoc.perl.org/perlre.html Обратите внимание, что не все функции поддерживаются всеми языками.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню