Wie entferne ich Zeilenumbrüche (keine Zeichen!) Aus der Zeichenfolge?

146

Dies scheint ein Betrug zu sein, aber seien Sie versichert, dass dies nicht der Fall ist. Ich habe sowohl SO als auch den Rest des Webs nach einer Antwort auf mein Problem durchsucht und immer wieder dieselben unzureichenden "Lösungen" gefunden. Wie auch immer, hier geht es:

Ich speichere Benutzereingaben aus einem Textbereich in eine MySQL-Datenbank (in einer WordPress-Umgebung, aber das sollte für dieses Problem meiner Meinung nach keine Rolle spielen). Es wird später aus der Datenbank abgerufen und den Administratoren im Backend der Site angezeigt. Das Problem tritt auf, wenn Benutzer Text mit Zeilenumbrüchen senden (dh die Eingabetaste drücken).

Eine Beispielzeichenfolge könnte folgendermaßen aussehen:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

Die Zeichenfolge enthält keine Zeilenendezeichen ("\ n", "\ r" oder ähnliches).

Ich verwende nl2br()es, um eine HTML-Ausgabe zu generieren, aber das reicht nicht aus. Das Ergebnis ist dann:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

Was ist nl2br()meines Wissens das erwartete Ergebnis, da dadurch die Tags eingefügt werden und die Zeilenumbrüche nicht ersetzt werden sollen?

Das Format, das ich brauche, wäre jedoch folgendes:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Wenn die Zeichenfolge EOL-Zeichen wie "\ n" enthalten würde, würde ich sie entweder mit str_replace()oder drücken preg_replace()und damit fertig sein, aber ich habe keine Ahnung, welche Nadel eine dieser Funktionen füttern soll, wenn dort keine Zeichen vorhanden sind an erster Stelle.

Ich kann manuell auf das entsprechende Feld in der Datenbank zugreifen, bei jedem Zeilenumbruch die Rücktaste drücken und was ich später mit der Zeichenfolge tun möchte, funktioniert. Ich weiß also, dass ich das obige Format brauche.

Johannes Pille
quelle
Wenn die Zeichenfolge wie Ihr erstes Beispiel aussieht, wie können Sie dann sagen, dass sie keine Zeilenumbruchzeichen enthält? Es hat mindestens zwei: zwei in einer Reihe nach "Danke!"
Ernest Friedman-Hill
Fair enuff @ ErnestFriedman-Hill, Sie haben offensichtlich Recht - da ist "etwas", es ist nur weder sichtbar noch etwas, was ich weiß.
Johannes Pille
Ich kann auch nicht sehen, wie es möglich ist, neue Zeilen ohne Zeilenumbruchzeichen zu haben. Können Sie einen Hex-Editor verwenden, um die Zeichenfolge zu überprüfen - ich bin sicher, Sie werden die Zeichen für neue Zeilen finden ...
Brennnessel

Antworten:

376

Sie sollten in der Lage sein, es durch ein Preg zu ersetzen, das alle Zeilenumbrüche und Wagenrückläufe entfernt. Der Code lautet:

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

Auch wenn die \nZeichen nicht angezeigt werden, befindet sich dort ein unsichtbares Zeichen, wenn Sie Wagenrückläufe erhalten. Der Preg-Ersatz sollte diese greifen und reparieren.

Ben Roux
quelle
Unglaublich. Ich hätte schwören können, alles nach Ihren und @bsdnoobz Antworten zu versuchen, die beide den Job machen. Na ja, egal welche mentale Blockade ich dort hatte, ihr beide habt mir jede Menge Zeit gespart. Es stellte sich heraus, dass es eine ziemlich dumme Frage war, denke ich. Danke Leute!
Johannes Pille
3
Beachten Sie, dass dies nicht mit allen Zeilenumbrüchen übereinstimmt, dh denen, die auf Windows-Systemen erstellt wurden. Um diese zu fangen, können Sie stattdessen die folgende RegEx verwenden/\r|\n|\r\n/
Toastrackenigma
6
Verwenden Sie \ R (das eine beliebige Zeilenendsequenz darstellt) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

Bens Lösung ist akzeptabel, aber str_replace () ist weitaus schneller als preg_replace ()

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

Mit weniger CPU-Leistung werden die weltweiten Kohlendioxidemissionen reduziert.

Demis Palma ツ
quelle
5
Ich kann nicht glauben, dass diese Antwort nicht glaubwürdiger wird. 100 Daumen hoch dazu über preg_replace ()
pimbrouwers
62
WICHTIG: Verwenden Sie DOPPELTE ANGEBOTE um den Wagenrücklauf- und den Zeilenumbruchcode. Diese werden nicht korrekt verarbeitet, wenn Sie einfache Anführungszeichen verwenden!
Bwright
47
Daumen hoch -> "Mit weniger CPU-Leistung werden die weltweiten Kohlendioxidemissionen reduziert."
Jan
3
@Joeri: Das letzte wird nie angerufen, da es von den ersten beiden erledigt wird. Es ist redundanter Code.
Nightfox89
4
@Joeri Wenn str_replace alle Vorkommen entfernt, würden nicht \ r und \ n beide ALLE trotzdem entfernt werden?
Bram Vanroy
16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line
flussfrei
quelle
11

Das liegt daran nl2br(), dass neue Zeilen überhaupt nicht entfernt werden.

Returns String mit <br />oder <br> eingefügt vor allen Zeilenumbrüchen ( \r\n, \n\r, \nund \r).

Verwenden Sie str_replacestattdessen:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
Kenorb
quelle
7

Sie können auch PHP-Trim verwenden

Diese Funktion gibt eine Zeichenfolge zurück, deren Leerzeichen vom Anfang und Ende der Zeichenfolge entfernt sind. Ohne den zweiten Parameter entfernt trim () die folgenden Zeichen:

  • "" (ASCII 32 (0x20)), ein gewöhnlicher Raum.
  • "\ t" (ASCII 9 (0x09)), eine Registerkarte.
  • "\ n" (ASCII 10 (0x0A)), eine neue Zeile (Zeilenvorschub).
  • "\ r" (ASCII 13 (0x0D)), ein Wagenrücklauf.
  • "\ 0" (ASCII 0 (0x00)), das NUL-Byte.
  • "\ x0B" (ASCII 11 (0x0B)), eine vertikale Registerkarte.
Gijs de Jong
quelle
3
Dies zielt nur auf Zeilenumbrüche am Anfang und Ende der Zeichenfolge ab. Zeilenumbrüche in der Mitte der Zeichenfolge bleiben unberührt.
Mickmackusa
6

Um auch unter Windows richtig zu funktionieren, würde ich empfehlen, zu verwenden

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

"\r\n"- für Windows, "\r"- für Mac und "\n"- für Linux

Ajjaah
quelle
2
Tut mir leid, Kumpel, aber selbst nachdem ich 12 gefragt habe, kann ich Ihnen mit absoluter Sicherheit sagen, dass dies überflüssig ist. Fragen Sie sich Folgendes: Wenn alle \rund \nin der Zeichenfolge entfernt werden, warum sollte dies nicht für diejenigen der Fall sein, die direkt aufeinander folgen?
Johannes Pille
Wirklich, diese offensichtliche Sache ist mir nicht in den Sinn gekommen ... Danke :) Ich habe gerade festgestellt, dass ich Probleme damit hatte, aber es war umgekehrt, ich habe es \r\nunter Windows verwendet und es hat unter Linux nicht funktioniert.
Ajjaah
Nun, ich benutze diese Funktion, um Zeilenumbrüche durch Kommas zu ersetzen, sodass eine Adresse ein einzeiliger Text ist. Das Ersetzen von \r\nFIRST würde also helfen, da dies für jeden Teil ein Komma anstelle von zwei bedeutet, wenn dieser Zeilenumbruch
Martin
@Martin Ja, Sie haben Recht, ich habe gerade das Gleiche erkannt, also ersetzen wir \r\nzuerst, dann ersetzen wir \rund \nich habe meine Antwort bearbeitet.
Ajjaah
Dies ist immer noch redundant. Wenn Sie alle entfernen möchten \rund \rkeine Entfernung erforderlich ist, \r\nkönnen Sie den Benutzer verwenden str_replace(array("\r","\n"), "", $buffer);, um das gleiche Ergebnis zu erzielen.
Stramin
6

str_replace (PHP_EOL, null, $ str);

Rafanake
quelle
1
Dies kann die Frage beantworten. Es wird empfohlen, ein wenig über Ihre Antwort zu erklären.
Anirudh Sharma
PHP_EOL funktioniert nicht immer, wenn Sie einen String lesen. Es tut, wenn Sie sie schreiben.
Nightfox89
Nur-Code-Antworten sind bei StackOverflow von geringem Wert, da sie nur sehr wenig zur Aufklärung des OP und zukünftiger Leser beitragen.
Mickmackusa
4

Etwas etwas funktionaler (überall einfach zu bedienen):

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

Die Verwendung von PHP_EOL als Suchersatzparameter ist ebenfalls eine gute Idee! Ein großes Lob.

tfont
quelle
1

Alternative eingebaute: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Es dient dazu, Zeilenumbrüche aus verschiedenen Arten von Textdateien zu entfernen, verarbeitet jedoch kein HTML.

NVRM
quelle
0

Ich benutze 3 Zeilen, um diesen Job zu machen, also betrachte $ s als dein "Zeug" ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
PYK
quelle