Wie kann ich Zeichenfolgen in ein Array einfügen, die durch eine neue Zeile getrennt sind?

220

Ich habe eine Zeichenfolge mit Zeilenumbrüchen in meiner Datenbank. Ich möchte diesen String in ein Array konvertieren und für jede neue Zeile eine Indexstelle im Array überspringen.

Wenn die Zeichenfolge lautet:

My text1
My text2
My text3

Das Ergebnis, das ich möchte, ist folgendes:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Johan
quelle
1
Ich kenne PHP nicht, aber es gibt normalerweise eine Funktion namens "split" für Strings. Es funktioniert so: array = split (string, "\ n")
Sedat Kapanoglu
Sie sollten wahrscheinlich zuerst die Zeilenumbrüche normalisieren. Die Methode s($yourString)->normalizeLineEndings()ist mit github.com/delight-im/PHP-Str (Bibliothek unter MIT-Lizenz) verfügbar, die viele andere nützliche String-Helfer enthält. Vielleicht möchten Sie einen Blick auf den Quellcode werfen.
Caw

Antworten:

290

Sie können die explodeFunktion mit " \n" als Trennzeichen verwenden:

$your_array = explode("\n", $your_string_from_db);

Zum Beispiel, wenn Sie diesen Code haben:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Sie würden diese Ausgabe erhalten:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


Beachten Sie, dass Sie eine Zeichenfolge in doppelten Anführungszeichen verwenden müssen , die \ntatsächlich als Zeilenumbruch interpretiert wird.
(Weitere Informationen finden Sie auf dieser Handbuchseite.)

Pascal MARTIN
quelle
52
Stattdessen \nkönnen Sie die vordefinierte Konstante verwenden PHP_EOL.
Tim
40
Bitte seien Sie vorsichtig mit dieser Lösung, da sie nicht in allen Zeilenumbrüchen funktioniert. Ich hatte den größten Erfolg mit Davids Antwort
Maurice
1
Sie müssen entweder \ n oder \ r teilen, um alle Arten von Texten verarbeiten zu können - dies funktioniert nur mit Linux- und Windows-Zeilenumbrüchen. Mac-Zeilenumbrüche werden ignoriert! (\ r)
Steve Horvath
1
Ich denke, Tims Antwort / Kommentar ist nicht richtig, da dies nur dem Zeilenumbruch eines IHREN Systems entspricht, aber wenn Sie Zeichenfolgen erhalten, die Zeilenumbrüche von anderen Systemen aufweisen, funktioniert dies nicht! Hatte dieses Problem mit E-Mails
Asara
7
Nein, diese Antwort und die Kommentare zu dieser Antwort sind FALSCH! Weil dies den Newline-Charakter des Betriebssystems nicht berücksichtigt, insbesondere nicht PHP_EOL. Sie müssen verwenden preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84
330

Ich habe das immer mit großem Erfolg benutzt:

$array = preg_split("/\r\n|\n|\r/", $string);

(aktualisiert mit dem finalen \ r, danke @LobsterMan)

David
quelle
11
Diese Antwort sollte oben anstelle von Pascals stehen. Das hat nicht in allen Fällen funktioniert.!
Jithesh Kt
1
Das ist die Antwort. Der validierte ist FALSCH. Nun, hesselbom hat es auch ... Sie könnten auch dieses Äquivalent verwenden: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); der Schönheit zuliebe :) Warum ist das die einzig gute Antwort? Da Sie nicht davon ausgehen können, welche Art von Zeilenende Sie erhalten: Mac (\ r), Windows (\ r \ n) oder Unix (\ n).
Ninj
2
\R Spiele \n , \rund\r\n
mpen
1
Oder kürzer/\r?\n/
Jason Schilling
Dieses Beispiel ist korrekt, da Sie nicht einfach eine Teilungsoperation ausführen können, die nur auf einem einzelnen Zeichen basiert. Wenn Sie dies tun und auf '\ r' oder '\ n' auslösen, erhalten Sie im Falle eines Windows-Endes "\ r \ n" eine überflüssige leere Zeile. Und es ist wichtig, dass zuerst das zweistellige Windows-Trennzeichen getestet wird.
AndresRohrAtlasInformatik
281

Ein Zeilenumbruch wird auf verschiedenen Plattformen unterschiedlich definiert: \ r \ n, \ r oder \ n.

Mit RegExp zum Teilen der Zeichenfolge können Sie alle drei mit \ R abgleichen

Also für dein Problem:

$array = preg_split ('/$\R?^/m', $string);

Das würde zu Zeilenumbrüchen unter Windows, Mac und Linux passen!

hesselbom
quelle
3
Ich habe dies auch anstelle der akzeptierten Antwort und aller anderen Antworten in diesem Thread verwendet. Hinterlasse diesen Kommentar nur als informativ.
Seth Malaki
3
Eigentlich hat das bei mir nicht funktioniert. Manchmal waren in den Array-Schlüsseln noch Zeilenumbrüche vorhanden.
Maurice
32
Verwenden Sie einfach$array = preg_split ('/\R/', $string);
Jan Goyvaerts
18
Funktioniert manchmal nicht! preg_split("/\r\n|\n|\r/", $string)bessere Wahl
Alexey B.
34

PHP kennt bereits die Zeilenumbruchzeichen des aktuellen Systems. Verwenden Sie einfach die EOL-Konstante.

explode(PHP_EOL,$string)
voidstate
quelle
18
Ja, aber man kann eine Datei oder wie in diesem Beispiel einen Datenbankeintrag in Windows bearbeiten und dann beispielsweise auf einem Linux-System verwenden. Ich denke, ein allgemeiner Ansatz würde besser passen.
Cranio
Ich bin mir nicht sicher, ob das richtig ist. Wenn ein Textbereich auf einer Webseite gesendet wird, kann er je nach Browser des Benutzers und nicht nach Betriebssystem des Servers unterschiedliche Zeilenendezeichen haben. Egal welches Betriebssystem Sie verwenden, Sie müssen in der Lage sein, alles zu analysieren. Dies setzt natürlich voraus, dass Sie Web-Sachen machen.
Magmatisch
Möglicherweise müssen Sie dann trim()die resultierenden Zeichenfolgen verwenden, um überflüssige Leerzeichen zu entfernen.
Tim
30

Eine Alternative zu Davids Antwort, die schneller (viel schneller) ist, ist die Verwendung von str_replaceund explode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

Was passiert ist:
Da Zeilenumbrüche in verschiedenen Formen auftreten können, werden str_replacestattdessen I \ r \ n, \ n \ r und \ r mit \ n (und das Original \ n bleiben erhalten).
Dann explodieren Sie weiter \nund Sie haben alle Zeilen in einem Array.

Ich habe einen Benchmark auf dem src dieser Seite durchgeführt und die Zeilen 1000 Mal in einer for-Schleife geteilt und:
preg_replaceeinen Durchschnitt von 11 Sekunden genommen,
str_replace & explodeeinen Durchschnitt von ungefähr 1 Sekunde

Weitere Details und bencmark Infos in meinem Forum

Schilf
quelle
Ihr Forum-Link (und die gesamte Domain) scheinen
ausgefallen
19

David: Großartige Richtung, aber du hast es verpasst. das hat bei mir funktioniert:

$array = preg_split("/(\r\n|\n|\r)/", $string);
LobsterMan
quelle
11

Sie benötigen weder preg_ * -Funktionen noch preg-Muster noch str_replace innerhalb usw., um einen String erfolgreich durch Zeilenumbrüche in ein Array zu zerlegen. In allen Szenarien, sei es Linux / Mac oder m $, reicht dies aus.

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL ist eine Konstante, die die von der Serverplattform verwendeten Zeilenumbruchzeichen enthält.

Gruslig
quelle
3
Die Datei könnte von einem anderen System mit anderen neuen Zeilen stammen, insbesondere in einer Netzumgebung, für die PHP verwendet wird
Luca C.
Welches ist genau der Grund, warum diese Konstante existiert .. und behandelt dieses spezielle Problem.
Spooky
Wenn Sie eine Datei von Windows nehmen, stimmt sie nicht mit einer Datei von Unix oder Mac überein, oder?
Luca C.
Wenn Sie immer und überall reines utf-8 verwenden, normalerweise utf8-Dateien, und Sie nur PHP_EOL im Code von Yours für die Erkennung von Zeilenumbrüchen haben, wird es wie beschrieben abgeglichen und es tritt kein unvorhergesehenes Verhalten auf. Denken Sie daran, dass ich das nicht nur schreie und behaupte. Die Benutzerfreundlichkeit von PHP_EOL ist ziemlich bestätigt.
Spooky
1
In Ihrem Fall ist es möglicherweise besser, wenn Sie str_replace verwenden (schneller als regulärer Ausdruck), wenn Quellen von einem anderen Ort stammen und nicht gut gebildet sind. ... alles in allem, sei es Regexp. oder str_replace oder PHP_EOL, es gibt einen guten alten Satz, der sagt: "Wenn es funktioniert - fass es nicht an!". :)
Spooky
9
explode("\n", $str);

Das "(anstelle von ') ist ziemlich wichtig, da sonst der Zeilenumbruch nicht interpretiert wird.

Damien MATHIEU
quelle
9

Mit StackOverflow kann ich die Antwort von hesselbom nicht kommentieren (nicht genügend Ruf), daher füge ich meine eigene hinzu ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

Dies funktionierte am besten für mich, da außerdem führende (zweite \ s *) und nachfolgende (erste \ s *) Leerzeichen automatisch eliminiert werden und auch Leerzeilen übersprungen werden (das PREG_SPLIT_NO_EMPTY-Flag).

- = OPTIONEN = -

Wenn Sie weiterhin führende Leerzeichen verwenden möchten, entfernen Sie einfach das zweite \ s * und machen Sie es stattdessen zu einem rtrim () ...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

Wenn Sie leere Zeilen behalten müssen, entfernen Sie das NULL-Flag (es ist nur ein Platzhalter) und das PREG_SPLIT_NO_EMPTY-Flag wie folgt ...

$array = preg_split('/\s*\R\s*/', trim($text));

Oder sowohl führende Leerzeichen als auch Leerzeilen beibehalten ...

$array = preg_split('/\s*\R/', rtrim($text));

Ich sehe keinen Grund, warum Sie jemals Leerzeichen nachziehen möchten, daher schlage ich vor, die ersten \ s * dort zu belassen. Aber wenn Sie nur nach neuen Zeilen aufteilen möchten (wie der Titel schon sagt), ist dies DIESES Einfache (wie von Jan Goyvaerts erwähnt) ...

$array = preg_split('/\R/', $text);
Deen Foxx
quelle
Der mModifikator wird nicht wirklich benötigt, oder? Betrifft das nicht nur ^und $?
Mpen
@mpen Ja, ich glaube du bist richtig. Ich habe es nur zusammen mit Hesselboms Version getragen. Ich werde meinen Beitrag bearbeiten.
Deen Foxx
7
<anti-answer>

Verwenden Sie, wie in anderen Antworten angegeben, die Verwendung explodeund nicht die Verwendung splitvon PHP 5.3.0 split. Das Folgende ist NICHT so, wie Sie es tun möchten:

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr (10), CR = "\ r" = chr (13)

</anti-answer>
Tom
quelle
3

Verwenden Sie explode, wenn Sie versuchen, Cronjobs in einem Crontab anzuzeigen und frustriert sind, wie jede Zeile getrennt werden soll:

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

Die Verwendung von '\ n' scheint nicht zu funktionieren, aber chr (10) funktioniert gut: D.

Ich hoffe, das erspart jemandem Kopfschmerzen.

Jeff
quelle
Hallo Jeff, willkommen bei SO. Sie sollten dies als Frage und Antwort umschreiben und nicht als Antwort auf die Frage eines anderen. Dies ist eine Q & A-Site, kein allgemeines Forum. Werfen
Rebecca Scott
Die Verwendung '\n'funktioniert nicht, da Escape-Sequenzen nicht in einfachen Anführungszeichen interpretiert werden. Sie müssen stattdessen doppelte Anführungszeichen verwenden: "\n"anstelle von 'n'Read php.net/manual/en/language.types.string.php
Christopher K.
2

Sie können dies verwenden:

 \str_getcsv($str,PHP_EOL);
parisssss
quelle
2

Sie können einen $ string = nl2br ($ string) ausführen, sodass Ihr Zeilenumbruch in geändert wird

<br />. 

Auf diese Weise spielt es keine Rolle, ob das System \ r \ n oder \ n oder \ r verwendet

Dann können Sie es in ein Array einspeisen:

$array = explode("<br />", $string);
Sandor
quelle
Hinweis: nl2br ersetzt die Zeilenumbrüche nicht. Es wird nur vor jedem Zeilenumbruch ein Unterbrechungs-Tag eingefügt . Alle Ihre Array-Elemente außer dem ersten beginnen also mit einem Zeilenumbruch. Wenn Ihnen das egal ist, ist diese Methode die schnellste. Wenn das wichtig ist, ist Jakars Antwort die schnellste.
Aust
2

Das ist mein Weg:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

Dadurch werden auch alle Leerzeilen übersprungen.

Axel
quelle
1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

wahres Array:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

Online einbetten:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>

Anteliebe
quelle
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft
1

Habe dies in den PHP-Dokumenten aufgegriffen:

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>
korwalskiy
quelle
0

Diese Methode funktioniert immer bei mir:

$uniquepattern="gd$#%@&~#"//Any set of characters which you dont expect to be present in user input $_POST['text'] better use atleast 32 charecters.
$textarray=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['text'])));

quelle
1
Ich liebe das Fluchen als Teil des Codes. :) Wie auch immer, das Ersetzen durch \ n ist sowohl einfacher als auch sicherer (siehe die anderen Antworten).
Stefan Reich
0

Die Verwendung nur des Basispakets ist auch eine Lösung für einfache Fälle:

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)
Roque
quelle
-6

Mit einem beliebigen Sonderzeichen zwischen dem String oder dem Zeilenumbruch \nmit PHP Explode können wir dies erreichen.

Yasin
quelle