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
)
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)
Ich habe das schon immer mit großem Erfolg benutzt:
$array = preg_split("/\r\n|\n|\r/", $string);
(aktualisiert mit dem Finale, danke @LobsterMan)
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!
PHP kennt bereits die Newline-Zeichen des aktuellen Systems. Verwenden Sie einfach die EOL-Konstante.
explode(PHP_EOL,$string)
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 Sekundenstr_replace & explode
dauerte ungefähr 1 Sekunde
Weitere Details und Informationen zu bencmark auf mein Forum
David: Gute Richtung, aber Sie haben\r verfehlt. das hat für mich funktioniert:
$array = preg_split("/(\r\n|\n|\r)/", $string);
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.
explode("\n", $str);
Das "(statt") ist ziemlich wichtig, da sonst der Zeilenumbruch nicht interpretiert wird.
<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>
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);
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.
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);
sie können dies verwenden:
\str_getcsv($str,PHP_EOL);
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);
?>
$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>
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)
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'])));
Das ist mein Weg:
$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);
Dadurch werden auch alle leeren Zeilen übersprungen.