Entfernen Sie neue Zeilen aus der Zeichenfolge und ersetzen Sie sie durch ein Leerzeichen


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Möchten Sie alle neuen Zeilen aus der Zeichenfolge entfernen.

Ich habe diesen regulären Ausdruck, er kann alle erfassen. Das Problem ist, dass ich nicht weiß, mit welcher Funktion ich ihn verwenden soll.

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

$string soll werden:

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

1
Wenn Sie Tausende von Ersetzungen vornehmen, vermeiden Sie die Verwendung preg_replace. Es ist fast doppelt so langsam wie str_replace.
Alex W

Möglicherweise finden Sie s($str)->normalizeLineEndings('')hilfreiche Informationen in dieser eigenständigen Bibliothek . Es werden nicht nur LF, CR und CRLF entfernt, sondern auch alle Unicode-Zeilenumbrüche.
Caw

Antworten:


578

Sie müssen mit doppelten Zeilenumbrüchen vorsichtig sein, die doppelte Leerzeichen verursachen würden. Verwenden Sie diesen wirklich effizienten regulären Ausdruck:

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

Mehrere Leerzeichen und Zeilenumbrüche werden durch ein einzelnes Leerzeichen ersetzt.

Bearbeiten: Wie andere bereits betont haben, gibt es bei dieser Lösung Probleme beim Abgleichen einzelner Zeilenumbrüche zwischen Wörtern. Dies ist im Beispiel nicht vorhanden, aber man kann leicht sehen, wie diese Situation auftreten könnte. Eine Alternative besteht darin, Folgendes zu tun:

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

10
Bevor Sie diese Lösung verwenden, lesen Sie meine Antwort unten und die Kommentare zu meiner Antwort. Diese Lösung funktioniert möglicherweise nicht wie erwartet.
Matsolof

1
Warum sollte es im regulären Ausdruck "\ s mit einem Leerzeichen übereinstimmen" mit einer neuen Zeile übereinstimmen?
Michael Z

2
Ich suchte nach einer Lösung, um alle Leerzeichen zu entfernen / zu ersetzen, aber keine (doppelten) Leerzeichen. Dies ist die Regex, die es getan hat:/(?![ ])\s+/
Algorithmus

Ich wollte dich nur wissen lassen, dass deine Lösung mir viel Zeit gespart hat.
Parthapratim Neog

183

Einige Kommentare zur akzeptierten Antwort:

Das +bedeutet "1 oder mehr". Ich glaube nicht, dass du es wiederholen musst \s. Ich denke du kannst einfach schreiben '/\s+/'.

Wenn Sie Leerzeichen zuerst und zuletzt in der Zeichenfolge entfernen möchten, fügen Sie hinzu trim.

Mit diesen Änderungen wäre der Code:

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

Du hast recht; /\s\s+/würde nicht mit dem Linefeed übereinstimmen foo\nbar.
Alan Moore

79

Benutz einfach preg_replace()

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

Sie könnten mit str_replace()diesem davonkommen , obwohl der Code nicht so sauber aussieht:

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

Sehen Sie es live auf ideone


1
OP möchte ein Leerzeichen zwischen "Absätzen" und "für". Wenn Sie nur die Zeilenumbrüche entfernen, gibt es keine.
Daniel Vandersluis

Bitte korrigieren Sie das zu$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

Sonst gibt es nichts mehr zu sagen. Das ist die einfachste Antwort, denke ich!
Erikbwork

3
@erik Dann würde ich es "falsch machen". Es funktioniert gut wie es ist.
NullUserException

1
@ Vineet Es ist nur ein Trennzeichen, das den Beginn und das Ende des
regulären Ausdrucks angibt

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

3
Escape-Sequenzen in PHP müssen in doppelte Anführungszeichen gesetzt werden.
Daniel Vandersluis

Dies macht jedoch nicht genau das, was das OP will, da dies die gleiche Antwort wie schwer fassbar ist und die \rZeichen nicht entfernt werden
NullUserException

@NullUser: Warum aktualisierst du nicht deinen eigenen Beitrag, anstatt dies zu kommentieren?
Fabrik

@NullUser: Außer der Tatsache, dass es alles durch '' anstelle von '' ersetzt.
fabrik

12

Sie sollten str_replace für seine Geschwindigkeit verwenden und doppelte Anführungszeichen mit einem Array verwenden

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

Ressourcenarm, perfekt, tks.
CONvid19

1
Ich könnte mich irren, aber dieser Code entfernt kein neues Zeilenzeichen auf Unix-Systemen, da auf diesen Systemen eine neue Zeile gerecht ist \nund \r\nich denke nicht, dass das OP darum bittet, ein neues Leerzeichen anstelle neuer Zeilen zu setzen
Marco Demaio

7

Ich bin mir nicht sicher, ob dies einen Wert gegenüber den bereits eingereichten Antworten hat, aber ich kann es genauso gut posten.

// 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-Regex-Ersetzungen können mit preg_replace durchgeführt werden: http://php.net/manual/en/function.preg-replace.php

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

Würde neue Zeilen ersetzen oder Zeichen durch ein Leerzeichen zurückgeben. Wenn Sie nicht möchten, dass etwas sie ersetzt, ändern Sie das zweite Argument in ''.


1
Die pregFunktionen verwenden reguläre Ausdrücke von PCRE und nicht von POSIX. Es gibt eregFunktionen, die POSIX verwenden, aber sie sind jetzt veraltet.
Daniel Vandersluis

5

Benutze das:

Ersetzen Sie eine Reihe von Zeilenumbrüchen durch eine leere Zeichenfolge:

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

oder Sie möchten wahrscheinlich Zeilenumbrüche durch ein einzelnes Leerzeichen ersetzen:

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

Bitte formatieren Sie Ihren Code richtig. Dies erfolgt durch Einrücken der entsprechenden Zeile um vier Leerzeichen.
Jwueller

2
Deshalb verwende ich einfache Anführungszeichen, damit ich diesen Zeichen nicht entkommen muss. \\nsieht schrecklich aus. \\\\ einen einzigen Backslash zu finden ist einfach schrecklich.
NullUserException

5

Die Escape-Sequenz\R entspricht einer generischen Newline

Das heißt, alles, was von Unicode als Zeilenumbruchsequenz angesehen wird. Dies umfasst alle Zeichen, die mit \v( vertikales Leerzeichen ) übereinstimmen , und die Mehrzeichenfolge \x0D\x0A...

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

Im 8-Bit-Nicht-UTF-8-Modus \Rentspricht dies dem Folgenden: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Demo


Anton bitte überprüfen, ob meine Bearbeitung in Ordnung ist! Einige weitere Informationen hinzugefügt.
Bobble Bubble

4

Zeilenumbrüche im Text werden im Allgemeinen wie folgt dargestellt:

\ r \ n - auf einem Windows-Computer

\ r - auf einem Apple-Computer

\ n - unter Linux

//Removes all 3 types of line breaks

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

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

3

Was ist mit:

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

Dies sollte eine ziemlich robuste Lösung sein, da \ n nicht auf allen Systemen richtig funktioniert, wenn ich mich nicht irre ...


Dies scheint nicht \ r zu ersetzen, sondern nur \ n: ideone.com/28KPcb
T30

Wie im Handbuch erwähnt, enthält PHP_EOL das richtige Zeilenende-Symbol für die aktuelle Plattform. Wenn Sie Zeichenfolgen von anderen Plattformen importieren oder nur schlecht formatierte Zeichenfolgen haben, kann dies zu Problemen führen.
GDY

Wenn Sie eine ziemlich geschlossene Umgebung haben, scheint mir dies die eleganteste Lösung zu sein, da sie plattformunabhängig und wahrscheinlich ziemlich leistungsfähig ist. Wenn Sie breitere Eingaben wie Import- / Exportszenarien haben, sollten Sie wahrscheinlich eine Regex-Lösung verwenden.
GDY

3

Ich war überrascht zu sehen, wie wenig jeder über Regex weiß.

Strip Newlines in PHP ist

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

In Perl

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

Bedeutung Ersetzen Sie alle Zeilenumbrüche am Ende der Zeile (aus Effizienzgründen) - optional vorangestellt von einem Wagenrücklauf - durch ein Leerzeichen.

\ n oder \ 015 ist Zeilenumbruch. \ r oder \ 012 ist Wagenrücklauf. ? in Regex bedeutet Übereinstimmung 1 oder Null des vorherigen Zeichens. $ in Regex bedeutet, dass das Zeilenende übereinstimmt.

Die ursprüngliche und beste Regex-Referenz ist perldoc perlre. Jeder Codierer sollte dieses Dokument ziemlich gut kennen: http://perldoc.perl.org/perlre.html Beachten Sie, dass nicht alle Funktionen von allen Sprachen unterstützt werden.


Diese Lösung hat bei mir nicht funktioniert, aber wie bereits erwähnt, muss ich mehr lesen, um die eigentliche Lösung zu erstellen. Ich war überrascht, dass dies nicht funktioniert hat.
Adam Whateverson

2

Dies ist das Muster, das ich verwenden würde

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

2

Vielleicht funktioniert das:

$str='\n';
echo str_replace('\n','',$str);

1

Dieser entfernt auch Tabs

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

1

Sie können versuchen, dass der folgende Code Leerzeichen und neue Zeilen in Ihrem Text beibehält.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

1

Viele dieser Lösungen haben bei mir nicht funktioniert. Dies hat den Trick gemacht: -

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

Hier ist die Referenz: - PCRE und New Lines


0

Dieser folgende Code funktioniert den gesamten Text. Bitte verwenden Sie ihn:

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

0

Sie können neue Linien und mehrere Leerzeichen entfernen.

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

echo $name;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.