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
)

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.)


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)


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!


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)

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


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);

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.


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.


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);

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>

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.


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 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);

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.


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>


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);
?>

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

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)

-6

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.