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

291
$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.
Алекс W
Вы могли бы найти s($str)->normalizeLineEndings('')полезным, как найти в этой автономной библиотеке . Он удалит не только LF, CR и CRLF, но и любой перевод строки Unicode.
кар

Ответы:

578

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

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

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

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

$string = trim(preg_replace('/\s+/', ' ', $string));
jwueller
источник
10
Прежде чем использовать это решение, ознакомьтесь с моим ответом ниже и комментариями к моему ответу. Это решение может работать не так, как вы ожидаете.
Матсолоф
1
в регулярном выражении "\ s Соответствует символу пробела", почему он соответствует символу новой строки?
Майкл З
2
Я искал решение удалить / заменить все пробелы, но не (двойные) пробелы. Это регулярное выражение, которое сделало это:/(?![ ])\s+/
Алгоритм
Просто хотел, чтобы вы знали, что ваше решение сэкономило мне много времени.
Партхапратим Неог
183

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

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

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

С этими изменениями код будет:

$string = preg_replace('/\s+/', ' ', trim($string));
matsolof
источник
Ты прав; /\s\s+/не сможет соответствовать переводу строки foo\nbar.
Алан Мур
79

Просто использовать preg_replace()

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

С этим можно обойтись str_replace(), хотя код не выглядит таким чистым:

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

Посмотри вживую на ideone

NullUserException
источник
1
OP хочет пробел между «абзацами» и «для». Если вы просто удалите символы новой строки, их не будет.
Даниэль Вандерслуис
пожалуйста исправьте это к$string = preg_replace("~[\r\n]~", "",$string);
erikbwork
Иначе больше нечего сказать. это самый простой ответ, я думаю!
erikbwork
3
@erik Тогда я бы "исправил" это. Работает нормально как есть.
NullUserException
1
@Vineet Это просто разделитель, обозначающий начало и конец регулярного выражения
NullUserException
21
$string = str_replace(array("\n", "\r"), ' ', $string);
Fabrik
источник
3
Escape-последовательности в PHP должны быть заключены в двойные кавычки.
Даниэль Вандерслёйс
Это не делает точно то, что хочет ОП, поскольку это то же самое, что и неуловимый ответ, и оно не удаляет \rсимволы
NullUserException
@NullUser: Почему бы вам не обновить свой пост вместо того, чтобы комментировать это?
Фабрика
@NullUser: За исключением того, что он заменяет все на «вместо».
Фабрика
12

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

str_replace(array("\r\n","\r"),"",$string);
RobertPitt
источник
Недостаток ресурсов, отлично, ткс.
CONvid19
1
Я могу ошибаться, но этот код не удаляет символ новой строки в системах Unix, потому что в этих системах новая строка является справедливой, \nа не \r\nболее того, я думаю, что OP просит поставить один пробел вместо новых строк
Marco Demaio
7

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

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

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

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);
Питер
источник
6

Заменить регулярные выражения PCRE можно с помощью preg_replace: http://php.net/manual/en/function.preg-replace.php

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

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

n00dle
источник
1
Эти pregфункции используют PCRE, а не POSIX, регулярные выражения. Есть eregфункции, использующие POSIX, но они устарели.
Даниэль Вандерслёйс
5

Использовать это:

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

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

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

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

Escape-последовательность\R соответствует общей новой строке

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

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

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

Regex101 Demo

Антон
источник
Антон, пожалуйста, проверьте, в порядке ли мое редактирование! Добавлена ​​дополнительная информация.
пузырьковый пузырь
4

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

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

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

\ n - в Linux

//Removes all 3 types of line breaks

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

$string = str_replace("\n", "", $string);
Аль-Амин Бхуйян
источник
3

Что насчет:

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

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

гды
источник
Кажется, это не заменяет \ r, а просто \ n: ideone.com/28KPcb
T30
Как упоминалось в руководстве, PHP_EOL содержит правильный символ «Конец строки» для текущей платформы. Если вы импортируете строки с других платформ или у вас просто плохо отформатированные строки, это может сломаться.
GDY
Если у вас довольно замкнутая среда, это кажется мне наиболее элегантным решением, потому что оно не зависит от платформы и, вероятно, довольно производительно… если у вас более широкий ввод, такой как сценарии импорта / экспорта, вам, вероятно, следует использовать решение регулярных выражений.
GDY
3

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

Уберите переводы строк в php

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

В перл

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

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

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

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

ekerner
источник
Это решение не сработало для меня, но, как уже упоминалось, мне нужно будет прочитать больше, чтобы получить реальное решение. Я был удивлен, что это не сработало.
Адам
2

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

$string = preg_replace('@[\s]{2,}@',' ',$string);
Раджив
источник
2

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

$str='\n';
echo str_replace('\n','',$str);
زياد
источник
1

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

$string = preg_replace('~[\r\n\t]+~', '', $text);
user3213174
источник
1

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

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );
PCMShaper
источник
1

Многие из этих решений не сработали для меня. Это сделало трюк, хотя: -

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

Вот ссылка: - PCRE и новые линии

Адам Уэйтерсон
источник
0

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

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

источник
0

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

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
Рамеш
источник