Explodieren Sie die PHP-Zeichenfolge durch eine neue Zeile

253

Einfach, richtig? Nun, das funktioniert nicht: - \

$skuList = explode('\n\r', $_POST['skuList']);
Webnet
quelle
28
Einfache Anführungszeichen bedeuten "Analysieren Sie diese Zeichenfolge nicht". Die Antwort von @ Select0r ist wahrscheinlich das, wonach Sie suchen.
Ryan Kinal
3
Mögliches Duplikat, wie neue Zeilen entfernt und aus dem PHP-String zurückgegeben werden? Das war bereits ein Duplikat von Reliably entfernen Newslines aus String und einigen anderen . Verwenden Sie die verdammte Suchfunktion, bevor Sie Fragen stellen!
Gordon
1
@ 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):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Larzan
quelle
5
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.

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

oder

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Alin Purcaru
quelle
21
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\n vor 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".

Select0r
quelle
52
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.

Spudley
quelle
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
)
Iman
quelle
10

Versuchen

explode(chr(10), $_POST['skuList']);
Oberdan
quelle
6

Für eine neue Linie ist es nur

$list = explode("\n", $text);

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?

Andrew Sledge
quelle
4

Setzen Sie die \nin doppelte Anführungszeichen:

explode("\n", $_POST['skuList']);

Wenn ich mich nicht irre, wird dies in einfachen Anführungszeichen als \und nseparat behandelt .

Russell Dias
quelle
3

Haben Sie versucht, doppelte Anführungszeichen zu verwenden?

piddl0r
quelle
3

Nicht perfekt, aber ich denke, es muss am sichersten sein. Fügen Sie nl2br hinzu :

$skuList = explode('<br />', nl2br($_POST['skuList']));
nggit
quelle
1

Versuche dies:

explode(PHP_EOF, $lines);
user3762492
quelle
3
Sicherlich PHP_EOL statt EOF
Ewen
1

So einfach wie es scheint

$skuList = explode('\\n', $_POST['skuList']);

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

Utsav Barnwal
quelle
0

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.

Richard Marskell - Drackir
quelle
0

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.

user37150
quelle
3
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.

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

im Formular Empfangsdatei:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];
KarlosFontana
quelle
0

Diese Methode funktioniert immer bei mir:

$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'])));

quelle
0

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);
Radosav Leovac
quelle
0

Sie können es mit Regex versuchen:

$skuList = explode('/[\r\n]+/', $_POST['skuList']);

Tarol
quelle
0

Hier ist, was für mich funktioniert hat. Getestet in PHP 5.6 sowie PHP 7.0:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
codemonkey
quelle