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

$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 ";
 caw27 июл. 2016 г., 01:58
Вы можете найтиs($str)->normalizeLineEndings('') полезно, как найдено вэта автономная библиотека, Это удалит не только LF, CR и CRLF, но также и любой перевод строки Unicode.
 Alex W20 июн. 2014 г., 15:23
Если вы делаете тысячи замен, избегайте использованияpreg_replace, Это почти в два раза медленнее, чемstr_replace.

Ответы на вопрос(17)

Решение Вопроса

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

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

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

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

$string = trim(preg_replace('/\s+/', ' ', $string));
 Maged Hamid25 авг. 2016 г., 12:55
Лучшее решение.
 xdevs2324 дек. 2015 г., 17:18
Это регулярное выражение действительно помогло мне, я думаю, что это лучший ответ.
 Alliswell20 июн. 2016 г., 12:09
Второе решение работает отлично.
 Michael Z11 июн. 2014 г., 02:00
в регулярном выражении "\ s Соответствует символу пробела", почему он соответствует символу новой строки?
 algorhythm31 июл. 2015 г., 09:53
Я искал решение удалить / заменить все пробелы, но не (двойные) пробелы. Это регулярное выражение, которое сделало это:/(?![ ])\s+/
 Parthapratim Neog31 июл. 2015 г., 12:26
Просто хотел, чтобы вы знали, что ваше решение сэкономило мне много времени.
 Stephan Weinhold10 нояб. 2015 г., 08:56
Этот RegEx - чистая красота!
 matsolof23 сент. 2010 г., 10:30
Прежде чем использовать это решение, ознакомьтесь с моим ответом ниже и комментариями к моему ответу. Это решение может работать не так, как вы ожидаете.

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

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

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

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

$string = preg_replace('/\s+/', ' ', trim($string));
 myol31 окт. 2016 г., 11:49
Спасибо. По текущему курсу, только еще 12 лет, пока ваш не станет лучшим ответом. Да благословит Бог ТАК.
 activeDev23 июл. 2012 г., 15:21
 Scott Leonard04 сент. 2015 г., 17:13
То же самое здесь, это решение работало отлично, тогда как более длинное регулярное выражение - нет. Спасибо!
 Alan Moore23 сент. 2010 г., 01:18
Ты прав;/\s\s+/ не сможет соответствовать переводу строки вfoo\nbar.
 BruceHill17 дек. 2012 г., 16:19
+1 Это решение сработало в моей ситуации, принятое решение по этому вопросу не сработало.
 emjr09 июл. 2019 г., 04:54
Спасибо за этот ответ! отлично работает, даже если ответили 9 лет назад ^ _ ^
 matsolof23 сент. 2010 г., 10:50
Хорошо, чтобы получить подтверждение того, что я прав. Кстати, что означают слова "foo" и "bar"? Я знаю, что они заполнители, но что на самом деле означают слова? И не лучше ли использовать более знакомые слова, которые будут менее запутанными для начинающих, в качестве заполнителей? Когда я впервые увидел «foo» и «bar» в том или ином учебнике, я подумал, что слова были кодом, и мне потребовалось некоторое время, чтобы понять, что это не так.

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

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

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

$str='\n';
echo str_replace('\n','',$str);
$string = str_replace(array("\n", "\r"), ' ', $string);
 fabrik21 сент. 2010 г., 16:02
@NullUser: За исключением того, что он заменяет все на «вместо».
 NullUserException21 сент. 2010 г., 15:54
Потому что мой ответ уже правильный (AFAIK)
 NullUserException21 сент. 2010 г., 15:40
Это не делает точно то, что хочет ОП, так как это то же самое, что неуловимый ответ, и это не удаляет\r персонажи
 fabrik21 сент. 2010 г., 15:43
@NullUser: Почему бы вам не обновить свой пост вместо того, чтобы комментировать это?
 Daniel Vandersluis21 сент. 2010 г., 15:37
Escape-последовательности в PHP должны быть заключены в двойные кавычки.

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

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

 Adam Whateverson08 апр. 2019 г., 18:36
Это решение не сработало для меня, но, как уже упоминалось, мне нужно будет прочитать больше, чтобы получить реальное решение. Я был удивлен, что это не сработало.

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

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

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

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

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

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

str_replace(array("\r\n","\r"),"",$string);
 Pedro Lobito01 сент. 2015 г., 16:14
Мало ресурсов, отлично, ткс.
 Marco Demaio21 янв. 2019 г., 21:48
Я могу ошибаться, но этот код не удаляет символ новой строки в системах Unix, потому что в этих системах новая строка просто\n и не\r\n более того, я думаю, что ОП просит поставить один пробел вместо новых строк

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

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

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

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

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

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

Regex101 Demo

 bobble bubble22 июл. 2017 г., 22:43
Антон, пожалуйста, проверьте, в порядке ли мое редактирование! Добавлена ​​дополнительная информация.

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

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

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

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

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

\ п - в Linux

//Removes all 3 types of line breaks

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

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

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

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

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

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

Смотрите это в прямом эфиреideone

 James21 сент. 2010 г., 15:41
первый не работает
 Vineet18 апр. 2014 г., 22:30
Что означает '~' в регулярных выражениях?
 fabrik21 сент. 2010 г., 16:18
Почему бы вам не прочитать весь вопрос сам? (подсказка: $ string должно стать: ...)
 NullUserException21 сент. 2010 г., 15:47
@Downvoters Объясните
 NullUserException21 сент. 2010 г., 15:44
@erik Тогда я бы "исправил" это. Работает нормально как есть.
 Daniel Vandersluis21 сент. 2010 г., 15:49
@Null Я просто иду по примеру вывода (хотя я не понизил).
 erikbwork21 сент. 2010 г., 15:42
пожалуйста, исправьте это$string = preg_replace("~[\r\n]~", "",$string);
 erikbwork21 сент. 2010 г., 15:42
Иначе больше нечего сказать. это самый простой ответ, я думаю!
 Daniel Vandersluis21 сент. 2010 г., 15:39
OP хочет пробел между «абзацами» и «для». Если вы просто удалите символы новой строки, их не будет.
 NullUserException21 сент. 2010 г., 16:17
@fabrik ОП сказал "Хочу удалить все новые строки". Ну, это именно то, что он делает.
 NullUserException21 сент. 2010 г., 15:47
@ Даниэль Я понял, что ОП хочет удалить все символы новой строки, точка.
 fabrik21 сент. 2010 г., 16:14
Ваш сценарий завершается ошибкой, потому что он возвращает: "положить конец между абзацами для переноса строки, добавить 2 пробела в конце" Посмотреть вживую @ideone.com/ugNOZ
 Alex Spencer31 дек. 2012 г., 01:36
Я должен был использовать "\\ n", например: $ row-> title = str_replace ("\\ n", '', $ row-> title);
 erikbwork21 сент. 2010 г., 15:48
Теперь вы уже изменили это, и я думаю, что это хорошо. Когда я загрузил ваш комментарий, он не включал ваши изменения. Btw. второй пример кода все еще пропускает точку с запятой. редактировать: ах, теперь я знаю, что вы имеете в виду. Да я забыл, что php лечит "а" по-разному
 NullUserException19 апр. 2014 г., 16:59
@Vineet Это просто разделитель, обозначающий начало и конец регулярного выражения.

Что насчет:

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

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

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

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

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

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

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

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

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

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

 n00dle21 сент. 2010 г., 15:52
Ой, хорошая мысль, извините! Исправляем сейчас.
 Daniel Vandersluis21 сент. 2010 г., 15:46
preg функции используют PCRE, а не POSIX, регулярные выражения. Естьereg функции, которые используют POSIX, но они устарели.

Ваш ответ на вопрос