Видаліть нові рядки з рядка та замініть одним порожнім пробілом


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.
Alex W

Ви можете виявити s($str)->normalizeLineEndings('')корисні, як це знайдено в цій самостійній бібліотеці . Це видалить не тільки LF, CR та CRLF, але й будь-який новий рядок Unicode.
каре

Відповіді:


578

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

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

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

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

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

10
Перш ніж використовувати це рішення, дивіться мою відповідь нижче та коментарі до моєї відповіді. Це рішення може не працювати, як ви очікували.
matsolof

1
у регулярному виразі "\ s Зіставити символ пробілу", чому він відповідає новому рядку?
Michael Z

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
ОП хоче пробіл між "абзацами" та "за". Якщо ви просто видалите символи нового рядка, жодного не буде.
Даніель Вандерслуйс

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

Інакше більше нічого сказати. це найпростіша відповідь, я думаю!
erikbwork

3
@erik Тоді я б це "включив". Це добре працює, як є.
NullUserException

1
@Vineet Це просто роздільник, що позначає початок і кінець регулярного
виразка

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

3
Послідовності втечі в PHP потрібно подвоїти.
Даніель Вандерслуйс

Це не робить саме те, чого хоче ОП, оскільки це те саме, що відповідь невловимий, і це не видалення \rсимволів
NullUserException

@NullUser: Чому ви не оновлюєте власний пост замість цього, коментуючи це?
fabrik

@NullUser: За винятком того, що він замінює все на "" замість "".
fabrik

12

Ви повинні використовувати str_replace для його швидкості та використання подвійних лапок з масивом

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

Мало ресурсів, ідеально, tks.
CONvid19

1
Я можу помилятися, але цей код не видаляє нову лінійну таблицю в системах Unix, тому що в цих системах нова лінія є справедливою \nі не \r\nбільше того, я думаю, що ОП просить поставити єдиний пробіл замість нових рядків
Марко Демайо

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

Послідовність виходу\R відповідає загальному новому рядку

тобто все, що вважається послідовністю відриву рядків від Unicode. Сюди входять всі символи, відповідні \v( вертикальний пробіл ), і послідовність з декількома символами \x0D\x0A...

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

У 8-бітовому режимі, який не є UTF-8 \R, еквівалентно наступному: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Демонстрація Regex101


Антон, будь ласка, перевір, чи моє редагування нормально! Додано додаткову інформацію.
пузир бульбашки

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 містить правильний символ 'End Of Line' для поточної платформи. Якщо ви імпортуєте рядки з інших платформ або у вас просто погано відформатовані рядки, це може порушитися.
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.