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


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));

10
Прежде чем использовать это решение, ознакомьтесь с моим ответом ниже и комментариями к моему ответу. Это решение может работать не так, как вы ожидаете.
Матсолоф

1
в регулярном выражении "\ s Соответствует символу пробела", почему он соответствует символу новой строки?
Майкл З

2
Я искал решение удалить / заменить все пробелы, но не (двойные) пробелы. Это регулярное выражение, которое сделало это:/(?![ ])\s+/
Алгоритм

Просто хотел, чтобы вы знали, что ваше решение сэкономило мне много времени.
Партхапратим Неог

183

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

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

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

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

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

Ты прав; /\s\s+/не сможет соответствовать переводу строки foo\nbar.
Алан Мур

79

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

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

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

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

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


1
OP хочет пробел между «абзацами» и «для». Если вы просто удалите символы новой строки, их не будет.
Даниэль Вандерслуис

пожалуйста исправьте это к$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

Иначе больше нечего сказать. это самый простой ответ, я думаю!
erikbwork

3
@erik Тогда я бы "исправил" это. Работает нормально как есть.
NullUserException

1
@Vineet Это просто разделитель, обозначающий начало и конец регулярного выражения
NullUserException

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

3
Escape-последовательности в PHP должны быть заключены в двойные кавычки.
Даниэль Вандерслёйс

Это не делает точно то, что хочет ОП, поскольку это то же самое, что и неуловимый ответ, и оно не удаляет \rсимволы
NullUserException

@NullUser: Почему бы вам не обновить свой пост вместо того, чтобы комментировать это?
Фабрика

@NullUser: За исключением того, что он заменяет все на «вместо».
Фабрика

12

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

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

Недостаток ресурсов, отлично, ткс.
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);

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


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 Обратите внимание, что не все функции поддерживаются всеми языками.


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

2

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

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



1

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

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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


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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.