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 ";
James
quelle
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));
jwueller
quelle
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));
Matsolof
quelle
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

NullUserException
quelle
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);
fabrik
quelle
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);
RobertPitt
quelle
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);
Peter
quelle
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 ''.

n00dle
quelle
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);
netom
quelle
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
quelle
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);
Md. Al Amin Bhuiyan
quelle
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 ...

GDY
quelle
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.

ekerner
quelle
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);
Rajeev
quelle
2

Vielleicht funktioniert das:

$str='\n';
echo str_replace('\n','',$str);
زياد
quelle
1

Dieser entfernt auch Tabs

$string = preg_replace('~[\r\n\t]+~', '', $text);
user3213174
quelle
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 );
PCMShaper
quelle
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

Adam Whateverson
quelle
0

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

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

quelle
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;
Ramesh
quelle