@ Gordon: Ha, ich habe gesehen, was Col. Shrapnel in dieser anderen Frage gesagt hat. Eigentlich ein bisschen traurig. Ich füge jedoch meine enge Abstimmung hinzu.
BoltClock
9
Zusätzlich zu den von anderen erwähnten einfachen Anführungszeichen sind CRLF-Paare \r\nnicht umgekehrt.
Powerlord
1
Versuchen Sie sich daran zu erinnern: \ R etur \ N
100k
Antworten:
410
Beste Übung
Wie im Kommentar zur ersten Antwort erwähnt, wird am besten die PHP-Konstante PHP_EOL verwendet, die die EOL ( End Of Line ) des aktuellen Systems darstellt .
$skuList = explode(PHP_EOL, $_POST['skuList']);
PHP bietet viele andere sehr nützliche Konstanten , mit denen Sie Ihr Codesystem unabhängig machen können. Unter diesem Link finden Sie nützliche und systemunabhängige Verzeichniskonstanten.
Warnung
Diese Konstanten machen Ihr Seitensystem unabhängig, aber beim Wechsel von einem System zu einem anderen können Probleme auftreten, wenn Sie die Konstanten mit Daten verwenden, die auf einem anderen System gespeichert sind. Die Konstanten des neuen Systems unterscheiden sich möglicherweise von denen des vorherigen Systems und die gespeicherten Daten funktionieren möglicherweise nicht mehr. Analysieren Sie Ihre Daten daher vollständig, bevor Sie sie speichern, um systemabhängige Teile zu entfernen.
AKTUALISIEREN
Durch den Kommentar von Andreas wurde mir klar, dass die hier vorgestellte "Best Practice" -Lösung nicht für den beschriebenen Anwendungsfall gilt: Die EOL (PHP) des Servers hat nichts mit der EOL zu tun, die der Browser (jedes Betriebssystem) verwendet. Aber von dort (dem Browser) kommt die Zeichenfolge.
Verwenden Sie also bitte die Lösung von @Alin_Purcaru ( drei nach unten ), um alle Ihre Grundlagen abzudecken (und seine Antwort zu verbessern):
Dies ist eine neue Antwort, aber es ist wahrscheinlich die beste und zu Recht akzeptierte Antwort
frazras
Das ist seltsam, da PHP es so will, dass du es machst :) Kannst du mir mehr Details über dein Betriebssystem und deine PHP-Version geben, vielleicht einen Code auf PasteBin oder etw. ähnlich?
Larzan
16
Sie können PHP_EOL nicht verwenden, da das System und die Eingabequelle nichts miteinander zu tun haben. Wenn der Benutzer neue Zeilen in Windows einfügt und PHP unter Linux ausgeführt wird, ist das Ergebnis möglicherweise fehlerhaft.
Barell
1
@barell genau, das ist die Situation, die ich im 'Warnung'-Teil beschreibe;) In der Frage wurde nicht explizit angegeben, dass es sich um eine alte Eingabe handelt, die in der Datenbank gespeichert ist. Bitte lesen Sie den 'Warnung'-Teil und Sie werden sehen, dass ich diese Situation dort abdecke.
Larzan
7
Diese Antwort ist für diesen Anwendungsfall einfach falsch. Verwenden Sie in diesem Fall nicht die Konstante PHP_EOL, da die Eingabequelle (z. B. der Browser des Benutzers) definitiv nicht Ihr System ist. Verwenden Sie eine Lösung, die sich um alle verschiedenen Zeilenenden kümmert (Antwort von Alin Purcaru).
Andreas
241
Decken Sie alle Fälle ab. Verlassen Sie sich nicht darauf, dass Ihre Eingabe aus einer Windows-Umgebung stammt.
Dies führt zu leeren Array-Elementen, wenn das eol ist \r\n. Um zu verhindern , dass entweder Gebrauch: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(beachten Sie, dass \r\nunnötig wird , wenn die Flagge verwendet wird ) oder einfach setzen \r\nvor dem \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave
2
@webbiedave PREG_SPLIT_NO_EMPTY ist nett, ABER es löscht leere Zeilen. Dies kann wünschenswert sein oder nicht.
JMS
Dieses Muster würde für mich zu jedem Buchstaben passen, weil es zum Erfolg führt, auch wenn nichts vorhanden ist. "?" bedeutet 0 oder einmal, daher ist es möglich, dass es übereinstimmt, auch wenn sowohl \ r als auch \ n nicht vorhanden sind. Sie sagen "behoben", aber das sehe ich nicht. Ich habe stattdessen / (\ r | \ n) + / verwendet.
Rolf
1
@Rolf Es scheint, dass ich in Eile eine Bearbeitung vorgenommen habe. Korrigierte es jetzt. Was Sie verwenden sollten, hängt davon ab, ob Sie die leeren Zeilen in der Ausgabe haben möchten oder nicht. Die Option aus meiner Antwort gibt auch leere Zeilen zurück.
Alin Purcaru
3
@AlinPurcaru Können Sie in der Antwort klarstellen, welche (beide, auch keine?) Leerzeichen zurückgeben und welche nicht?
Patrick
150
Versuchen Sie es "\n\r"(doppelte Anführungszeichen) oder einfach "\n".
Wenn Sie sich nicht sicher sind, welchen EOL-Typ Sie haben, führen Sie vor dem Explodieren einen str_replace aus und ersetzen Sie "\ n \ r" durch "\ n".
Einfache Anführungszeichen in PHP bedeuten "Analysieren Sie diese Zeichenfolge nicht". Das bedeutet, dass Ihre Steuerzeichen nicht analysiert werden, sondern als Literal (kein Zeilenumbruch und Wagenrücklauf, sondern tatsächliches Literal '\ n \ r'). Die Verwendung von doppelten Anführungszeichen bedeutet "Diese Zeichenfolge analysieren", und daher werden Ihre Steuerzeichen analysiert. +1
Ryan Kinal
17
/n/r? Ich weiß, dass das OP das geschrieben hat, aber das richtige Windows-EOL ist\r\n
webbiedave
20
Betrachten Sie die PHP- Zeilenende- Konstante : PHP_EOL.
Daniel W.
Hallo allerseits, das ist definitiv die richtige Antwort! Ich frage mich, warum @Alin Purcaru 44 Stimmen erhalten hat. Es ist falsch !!! Es funktioniert nicht immer richtig, obwohl es den Anschein hat, dass es den Job macht. Also hier ist mein Kommentar für alle, die an der gleichen Sache festhalten
Rafik Bari
3
Ignorieren Sie einfach das \ r, das letzte Betriebssystem, das es ohne \ n verwendet hat, war OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Daher erhalten Sie die besten Ergebnisse:explode("\n", str_replace("\r", '', $string));
DanielM
15
Viele Dinge hier:
Sie müssen doppelte Anführungszeichen verwenden, keine einfachen Anführungszeichen, da sonst die maskierten Zeichen nicht maskiert werden.
Die normale Reihenfolge ist \r\nnicht \n\r.
Abhängig von der Quelle erhalten Sie möglicherweise nur \ndie \r(oder sogar in ungewöhnlichen Fällen möglicherweise nur die \r)
In Anbetracht des letzten Punktes können Sie feststellen, dass die preg_split()Verwendung aller möglichen Varianten eine zuverlässigere Möglichkeit zur Aufteilung der Daten bietet als explode(). Alternativ können Sie auch explode()just verwenden \nund dann trim()alle \rZeichen entfernen , die noch herumhängen.
Gute Antwort. Prägnant, deckt alles ab. Vielen Dank!
Kosta Kontos
11
Diese PHP-Funktion explodiert Zeichenfolge durch Zeilenumbruch.
Achtung : Neue Zeile in Windows ist \ r \ n und unter Linux und Unix ist \ n
Diese Funktion ändert alle neuen Zeilen in den Linux- Modus und teilt sie dann auf. Achten Sie darauf, dass leere Zeilen ignoriert werden
function splitNewLine($text){
$code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));return explode("\n",$code);}
Beispiel
$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a));
Ausgabe
Array([0]=> salam
[1]=> man khobam
[2]=> to chi
[3]=> che khabar
[4]=> bashe baba raftam
)
Sie müssen nur den genauen Text "\ n" übergeben und das direkte Schreiben von \ n wird als Escape-Sequenz verwendet. Also "\\" , um einen einfachen Schrägstrich zu übergeben und dann "n" zu setzen
Erstens denke ich, dass es normalerweise \r\n, zweitens, nicht auf allen Systemen gleich ist. Das funktioniert nur unter Windows. Es ist ziemlich ärgerlich, herauszufinden, wie neue Leitungen ersetzt werden können, weil verschiedene Systeme sie unterschiedlich behandeln (siehe hier ). Sie könnten mit nur mehr Glück haben \n.
Wenn jemand anderes dies versucht hat, es aber nicht funktioniert hat, ist dies eine Erinnerung daran, dass Sie möglicherweise den gleichen Hirnfurz wie ich gemacht haben.
Haben Sie MySQL zuerst der Zeichenfolge entkommen? In diesem Fall ist das Zeilenumbruchzeichen kein Zeilenumbruchzeichen mehr.
Ich habe nichts unternommen , um das Parsen zu vermeiden. Ich habe es nur angepasst und durch '\ n' explodiert (buchstäblich Backslash und n anstelle des tatsächlichen Zeilenumbruchs.
Es macht absolut keinen Sinn, irgendwelche String-Manipulationen nach der MySQL-Flucht durchzuführen
Your Common Sense
0
Zeilenumbrüche beim Posten aus Eingabetextfeldern verlieren?
Was für mich schneller funktioniert, ist das Kopieren, Einfügen eines beliebigen Textes oder eines Excel- oder HTML-Tabellentyps oder eines Newline-Datentyps und das Einfügen in einen Textbereich anstelle einer Inputextbox: Dadurch bleiben die Zeilenumbrüche im POST erhalten.
<textareaid="txtArea"name="txtArea"rows="40"cols="170"></textarea><br><inputtype="submit"value="split lines into array"/>
$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));
PHP_EOL wird angeblich verwendet, um das Zeilenumbruchzeichen plattformübergreifend zu finden, sodass DOS / Unix-Probleme behandelt werden.
Versuche dies:
$myString ="Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";
$myArray = explode(PHP_EOL, $myString);
print_r($myArray);
\r\n
nicht umgekehrt.Antworten:
Beste Übung
Wie im Kommentar zur ersten Antwort erwähnt, wird am besten die PHP-Konstante PHP_EOL verwendet, die die EOL ( End Of Line ) des aktuellen Systems darstellt .
PHP bietet viele andere sehr nützliche Konstanten , mit denen Sie Ihr Codesystem unabhängig machen können. Unter diesem Link finden Sie nützliche und systemunabhängige Verzeichniskonstanten.
Warnung
Diese Konstanten machen Ihr Seitensystem unabhängig, aber beim Wechsel von einem System zu einem anderen können Probleme auftreten, wenn Sie die Konstanten mit Daten verwenden, die auf einem anderen System gespeichert sind. Die Konstanten des neuen Systems unterscheiden sich möglicherweise von denen des vorherigen Systems und die gespeicherten Daten funktionieren möglicherweise nicht mehr. Analysieren Sie Ihre Daten daher vollständig, bevor Sie sie speichern, um systemabhängige Teile zu entfernen.
AKTUALISIEREN
Durch den Kommentar von Andreas wurde mir klar, dass die hier vorgestellte "Best Practice" -Lösung nicht für den beschriebenen Anwendungsfall gilt: Die EOL (PHP) des Servers hat nichts mit der EOL zu tun, die der Browser (jedes Betriebssystem) verwendet. Aber von dort (dem Browser) kommt die Zeichenfolge.
Verwenden Sie also bitte die Lösung von @Alin_Purcaru ( drei nach unten ), um alle Ihre Grundlagen abzudecken (und seine Antwort zu verbessern):
quelle
Decken Sie alle Fälle ab. Verlassen Sie sich nicht darauf, dass Ihre Eingabe aus einer Windows-Umgebung stammt.
oder
quelle
\r\n
. Um zu verhindern , dass entweder Gebrauch:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(beachten Sie, dass\r\n
unnötig wird , wenn die Flagge verwendet wird ) oder einfach setzen\r\n
vor dem\r
:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
Versuchen Sie es
"\n\r"
(doppelte Anführungszeichen) oder einfach"\n"
.Wenn Sie sich nicht sicher sind, welchen EOL-Typ Sie haben, führen Sie vor dem Explodieren einen str_replace aus und ersetzen Sie "\ n \ r" durch "\ n".
quelle
/n/r
? Ich weiß, dass das OP das geschrieben hat, aber das richtige Windows-EOL ist\r\n
PHP_EOL
.explode("\n", str_replace("\r", '', $string));
Viele Dinge hier:
\r\n
nicht\n\r
.\n
die\r
(oder sogar in ungewöhnlichen Fällen möglicherweise nur die\r
)In Anbetracht des letzten Punktes können Sie feststellen, dass die
preg_split()
Verwendung aller möglichen Varianten eine zuverlässigere Möglichkeit zur Aufteilung der Daten bietet alsexplode()
. Alternativ können Sie auchexplode()
just verwenden\n
und danntrim()
alle\r
Zeichen entfernen , die noch herumhängen.quelle
Diese PHP-Funktion explodiert Zeichenfolge durch Zeilenumbruch.
Achtung : Neue Zeile in Windows ist \ r \ n und unter Linux und Unix ist \ n
Diese Funktion ändert alle neuen Zeilen in den Linux- Modus und teilt sie dann auf.
Achten Sie darauf, dass leere Zeilen ignoriert werden
Beispiel
Ausgabe
quelle
Versuchen
quelle
Für eine neue Linie ist es nur
Für einen neuen Zeilen- und Wagenrücklauf (wie in Windows-Dateien) ist es so, wie Sie es gepostet haben. Ist Ihre Skilliste ein Textbereich?
quelle
Setzen Sie die
\n
in doppelte Anführungszeichen:explode("\n", $_POST['skuList']);
Wenn ich mich nicht irre, wird dies in einfachen Anführungszeichen als
\
undn
separat behandelt .quelle
Haben Sie versucht, doppelte Anführungszeichen zu verwenden?
quelle
Nicht perfekt, aber ich denke, es muss am sichersten sein. Fügen Sie nl2br hinzu :
quelle
Versuche dies:
quelle
So einfach wie es scheint
Sie müssen nur den genauen Text "\ n" übergeben und das direkte Schreiben von \ n wird als Escape-Sequenz verwendet. Also "\\" , um einen einfachen Schrägstrich zu übergeben und dann "n" zu setzen
quelle
Erstens denke ich, dass es normalerweise
\r\n
, zweitens, nicht auf allen Systemen gleich ist. Das funktioniert nur unter Windows. Es ist ziemlich ärgerlich, herauszufinden, wie neue Leitungen ersetzt werden können, weil verschiedene Systeme sie unterschiedlich behandeln (siehe hier ). Sie könnten mit nur mehr Glück haben\n
.quelle
Wenn jemand anderes dies versucht hat, es aber nicht funktioniert hat, ist dies eine Erinnerung daran, dass Sie möglicherweise den gleichen Hirnfurz wie ich gemacht haben.
Haben Sie MySQL zuerst der Zeichenfolge entkommen? In diesem Fall ist das Zeilenumbruchzeichen kein Zeilenumbruchzeichen mehr.
Ich habe nichts unternommen , um das Parsen zu vermeiden. Ich habe es nur angepasst und durch '\ n' explodiert (buchstäblich Backslash und n anstelle des tatsächlichen Zeilenumbruchs.
quelle
Zeilenumbrüche beim Posten aus Eingabetextfeldern verlieren?
Was für mich schneller funktioniert, ist das Kopieren, Einfügen eines beliebigen Textes oder eines Excel- oder HTML-Tabellentyps oder eines Newline-Datentyps und das Einfügen in einen Textbereich anstelle einer Inputextbox: Dadurch bleiben die Zeilenumbrüche im POST erhalten.
im Formular Empfangsdatei:
quelle
Diese Methode funktioniert immer bei mir:
quelle
Versuche dies:
quelle
Sie können es mit Regex versuchen:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
quelle
Hier ist, was für mich funktioniert hat. Getestet in PHP 5.6 sowie PHP 7.0:
quelle