Usuń nowe wiersze z łańcucha i zastąp je jedną pustą spacją


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Chcesz usunąć wszystkie nowe linie z ciągu.

Mam to wyrażenie regularne, można je wszystkie złapać, problem polega na tym, że nie wiem z jaką funkcją powinienem go użyć.

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

$string powinno stać się:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
Jeśli wykonujesz tysiące wymiany, unikaj używania preg_replace. Jest prawie dwa razy wolniejszy niż str_replace.
Alex W

s($str)->normalizeLineEndings('')Pomocne mogą być informacje zawarte w tej niezależnej bibliotece . Usunie nie tylko LF, CR i CRLF, ale także wszelkie znaki nowej linii Unicode.
caw

Odpowiedzi:


578

Musisz być ostrożny w przypadku podwójnych podziałów linii, które spowodowałyby podwójne spacje. Użyj tego naprawdę wydajnego wyrażenia regularnego:

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

Wiele spacji i znaków nowej linii zastępuje się pojedynczą spacją.

Edycja: jak zauważyli inni, w tym rozwiązaniu występują problemy z dopasowywaniem pojedynczych znaków między wyrazami. Nie ma tego w przykładzie, ale łatwo można zobaczyć, jak taka sytuacja może wystąpić. Alternatywą jest wykonanie następujących czynności:

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

10
Przed użyciem tego rozwiązania zapoznaj się z moją odpowiedzią poniżej i komentarzami do mojej odpowiedzi. To rozwiązanie może nie działać zgodnie z oczekiwaniami.
matsolof

1
w wyrażeniu regularnym „\ s Dopasuj biały znak”, dlaczego miałby pasować do nowej linii?
Michael Z

2
Szukałem rozwiązania do usunięcia / zastąpienia wszystkich białych znaków, ale nie (podwójnych) spacji. Oto regex, który to zrobił:/(?![ ])\s+/
algorhythm

Chciałem tylko poinformować, że Twoje rozwiązanie pozwoliło mi zaoszczędzić dużo czasu.
Parthapratim Neog

183

Kilka komentarzy do zaakceptowanej odpowiedzi:

Te +środki „1 lub więcej.” Nie sądzę, że musisz powtarzać \s. Myślę, że możesz po prostu pisać '/\s+/'.

Ponadto, jeśli chcesz usunąć białe znaki na końcu i na końcu łańcucha, dodaj trim.

Po tych modyfikacjach kod wyglądałby następująco:

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

Masz rację; /\s\s+/nie pasowałoby do wejścia liniowego foo\nbar.
Alan Moore,

79

Po prostu użyj preg_replace()

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

Możesz sobie z str_replace()tym poradzić, chociaż kod nie wygląda na tak czysty:

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

Zobacz na żywo na ideone


1
OP chce spacji między „akapitami” a „za”. Jeśli po prostu usuniesz znaki nowego wiersza, nie będzie jednego.
Daniel Vandersluis,

Proszę to poprawić$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

W przeciwnym razie nie ma nic więcej do powiedzenia. to chyba najprostsza odpowiedź!
erikbwork

3
@erik W takim razie „poprawiałbym” to. Działa dobrze, jak jest.
NullUserException

1
@Vineet To tylko separator oznaczający początek i koniec wyrażenia regularnego
NullUserException

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

3
Sekwencje specjalne w PHP muszą być podwójnie cytowane.
Daniel Vandersluis,

Nie robi to jednak dokładnie tego, czego chce OP, ponieważ jest to to samo, co nieuchwytna odpowiedź i nie usuwa \rznaków
NullUserException

@NullUser: Dlaczego nie zaktualizujesz swojego postu zamiast komentować?
fabrik

@NullUser: Z wyjątkiem faktu, że zamienia wszystko na „” zamiast „”.
fabrik

12

Powinieneś użyć str_replace ze względu na jego szybkość i podwójne cudzysłowy z tablicą

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

Niski poziom zasobów, doskonały, tks.
CONvid19

1
Mogę się mylić, ale ten kod nie usuwa znaku nowej linii w systemach Unix, ponieważ w tych systemach nowa linia jest \n\r\n
słuszna,

7

Nie jestem pewien, czy ma to jakąkolwiek wartość w stosunku do już przesłanych odpowiedzi, ale równie dobrze mogę to opublikować.

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

Zastąpienia wyrażeń regularnych PCRE można wykonać za pomocą preg_replace: http://php.net/manual/en/function.preg-replace.php

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

Zastąpiłby nowy wiersz lub zwrócił znaki spacją. Jeśli nie chcesz, aby cokolwiek je zastępowało, zmień drugi argument na ''.


1
Te pregfunkcje użyć PCRE, nie POSIX wyrażenia regularne. Istnieją eregfunkcje korzystające z POSIX, ale są one obecnie przestarzałe.
Daniel Vandersluis,

5

Użyj tego:

zamień serię nowych wierszy na pusty ciąg:

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

lub prawdopodobnie chcesz zastąpić znaki nowej linii pojedynczą spacją:

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

Proszę poprawnie sformatować kod. Odbywa się to poprzez wcięcie odpowiedniej linii o cztery spacje.
jwueller

2
Dlatego używam pojedynczych cudzysłowów, więc nie muszę uciekać od tych znaków. \\nwygląda okropnie. \\\\ dopasowanie pojedynczego ukośnika jest po prostu okropne.
NullUserException,

5

Sekwencja Escape\R odpowiada ogólnej nowej linii

to znaczy wszystko, co Unicode uważa za sekwencję łamania linii. Obejmuje to wszystkie znaki pasujące do \v( pionowe białe znaki ) oraz sekwencję wieloznakową \x0D\x0A...

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

W 8-bitowym trybie innym niż UTF-8 \Rodpowiada to, co następuje: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Demo


Anton, proszę sprawdź, czy moja edycja jest poprawna! Dodano dodatkowe informacje.
bobble bubble

4

Podziały wiersza w tekście są zazwyczaj przedstawiane jako:

\ r \ n - na komputerze z systemem Windows

\ r - na komputerze Apple

\ n - w systemie Linux

//Removes all 3 types of line breaks

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

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

3

O co chodzi:

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

To powinno być dość solidne rozwiązanie, ponieważ \ n nie działa poprawnie we wszystkich systemach, jeśli się nie mylę ...


Nie wydaje się to zastępować \ r, ale po prostu \ n: ideone.com/28KPcb
T30

Jak wspomniano w instrukcji PHP_EOL zawiera poprawny symbol „End Of Line” dla bieżącej platformy. Jeśli importujesz ciągi z innych platform lub masz po prostu źle sformatowane ciągi, może się to zepsuć.
GDY

Jeśli masz dość zamknięte środowisko, wydaje mi się to najbardziej eleganckim rozwiązaniem, ponieważ jego niezależna od platformy i prawdopodobnie dość wydajna… jeśli masz szersze dane wejściowe, takie jak scenariusze importu / eksportu, prawdopodobnie powinieneś użyć rozwiązania wyrażenia regularnego.
GDY

3

Byłem zaskoczony, widząc, jak mało wszyscy wiedzą o wyrażeniach regularnych.

Strip newlines w php jest

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

W perl

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

To znaczy zastąp dowolny znak nowej linii na końcu linii (dla wydajności) - opcjonalnie poprzedzony znakiem powrotu karetki - spacją.

\ n lub \ 015 jest znakiem nowej linii. \ r lub \ 012 to powrót karetki. ? w wyrażeniu regularnym oznacza dopasowanie 1 lub zero poprzedniego znaku. $ w wyrażeniu regularnym oznacza dopasowanie końca linii.

Oryginalnym i najlepszym odniesieniem do wyrażenia regularnego jest perldoc perlre, każdy programista powinien dobrze znać ten dokument: http://perldoc.perl.org/perlre.html Uwaga: nie wszystkie funkcje są obsługiwane przez wszystkie języki.


To rozwiązanie nie działało dla mnie, ale jak wspomniano, będę musiał przeczytać więcej, aby stworzyć rzeczywiste rozwiązanie. Byłem zaskoczony, że to nie zadziałało.
Adam Whateverson,

2

to jest wzór, którego użyłbym

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



1

Możesz wypróbować poniższy kod, aby zachować wszelkie białe znaki i nowe wiersze w tekście.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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


0

poniższy kod działa na cały tekst, użyj go:

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

0

Możesz usunąć nową linię i wiele białych znaków.

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

echo $name;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.