web-dev-qa-db-de.com

Wie füge ich String in Array ein, aufgeteilt nach neuer Zeile?

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

Wenn die Zeichenfolge lautet:

Mein Text1
Mein Text2
Mein Text3

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

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
184
Johan

Sie können die Funktion explode verwenden, indem Sie "\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 doppelte Anführungszeichenfolge verwenden müssen, sodass \n tatsächlich als Zeilenumbruch interpretiert wird .
(weitere Informationen finden Sie in dieser Handbuchseite)

246
Pascal MARTIN

Ich habe das schon immer mit großem Erfolg benutzt:

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

(aktualisiert mit dem Finale, danke @LobsterMan)

274
David

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

Wenn Sie die Zeichenfolge mit RegExp teilen, können Sie alle drei mit\R abgleichen

Also für dein Problem:

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

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

271
hesselbom

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

explode(PHP_EOL,$string)
32
voidstate

Eine Alternative zu Davids Antwort die schneller (viel schneller) ist, ist str_replace und explode.

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

Was passiert ist:
Da Zeilenumbrüche in verschiedenen Formen auftreten können, habe ich stattdessen str_replace\r\n,\n\r und\r mit\n (und das Original\n bleibt erhalten).
.__ Dann explodieren Sie auf \n und Sie haben alle Zeilen in einem Array.

Ich habe einen Benchmark auf der src dieser Seite gemacht und die Zeilen 1000 mal in einer for-Schleife aufgeteilt und:
preg_replace dauerte durchschnittlich 11 Sekunden
str_replace & explode dauerte ungefähr 1 Sekunde

Weitere Details und Informationen zu bencmark auf mein Forum

26
Reed

David: Gute Richtung, aber Sie haben\r verfehlt. das hat für mich funktioniert:

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

Sie benötigen keine preg_ * -Funktionen, keine Preg-Patterns oder str_replace innerhalb von etc. 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 Zeilenumbruchszeichen enthält, die von der Serverplattform verwendet werden.

9
Spooky
explode("\n", $str);

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

9
Damien MATHIEU
<anti-answer>

Da andere Antworten angegeben wurden, sollten Sie unbedingt explode anstelle von split verwenden, da ab PHP 5.3.0 split veraltet ist. Das Folgende istNICHTwie Sie es machen wollen:

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

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

</anti-answer>
7
Tom

StackOverflow erlaubt mir nicht, die Antwort von Hesselbom zu kommentieren (nicht genug Ruf), also 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, weil dadurch auch führende (zweite Sekunde) und nachfolgende Leerzeichen (zuerst) automatisch eliminiert werden und Leerzeilen übersprungen werden (das Flag PREG_SPLIT_NO_EMPTY).

- = OPTIONEN = -

Wenn Sie den Whitespace weiterführen wollen, entfernen Sie einfach den zweiten\s * und machen Sie ihn stattdessen zu einem Rtrim () ...

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

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

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

Oder halten Sie sowohl führende Leerzeichen als auch leere Zeilen ...

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

Ich sehe keinen Grund, warum Sie den Whitespace immer weiter verfolgen möchten, also schlage ich vor, den ersten Platz darin zu belassen. Wenn Sie jedoch nur nach einer neuen Zeile aufteilen möchten (wie der Titel schon sagt), ist dies einfach (wie von Jan Goyvaerts erwähnt) ...

$array = preg_split('/\R/', $text);
7
Deen Foxx

Für jeden, der versucht, Cronjobs in einer crontab anzuzeigen und frustriert über die Trennung der einzelnen Zeilen ist, verwenden Sie explode 

$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 einige Kopfschmerzen.

3
Jeff

Sie können $ string = nl2br ($ string) verwenden, damit 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);
2
Sandor

sie können dies verwenden:

 \str_getcsv($str,PHP_EOL);
2
parisssss

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);
?>
1
korwalskiy
$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>

1
antelove

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

> 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)
0
Roque

Diese Methode funktioniert immer für mich:

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

Das ist mein Weg:

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

Dadurch werden auch alle leeren Zeilen übersprungen.

0
Axel