J'ai une chaîne avec des sauts de ligne dans ma base de données. Je veux convertir cette chaîne en tableau, et pour chaque nouvelle ligne, sauter d'un index dans le tableau.
Si la chaîne est:
Mon texte1
Mon text2
Mon texte3
Le résultat que je veux est le suivant:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
Vous pouvez utiliser la fonction explode
en utilisant "\n
" comme séparateur:
$your_array = explode("\n", $your_string_from_db);
Par exemple, si vous avez ce morceau de code:
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);
Vous obtiendrez cette sortie:
array
0 => string 'My text1' (length=8)
1 => string 'My text2' (length=8)
2 => string 'My text3' (length=8)
Notez que vous devez utiliser une chaîne entre guillemets doubles , donc \n
est interprété comme un saut de ligne ...
(voir cette page de manuel pour plus de détails)
J'ai toujours utilisé cela avec beaucoup de succès:
$array = preg_split("/\r\n|\n|\r/", $string);
(mis à jour avec la version finale, merci @LobsterMan)
Un saut de ligne est défini différemment sur différentes plates-formes,\r\n,\r ou\n.
En utilisant RegExp pour scinder la chaîne, vous pouvez faire correspondre les trois avec\R
Donc pour votre problème:
$array = preg_split ('/$\R?^/m', $string);
Cela correspondrait aux sauts de ligne sous Windows, Mac et Linux!
PHP connaît déjà le caractère de nouvelle ligne du système actuel. Il suffit d'utiliser la constante EOL.
explode(PHP_EOL,$string)
Une alternative à Davids answer qui est plus rapide (beaucoup plus rapide) consiste à utiliser str_replace
et explode
.
$arrayOfLines = explode("\n",
str_replace(array("\r\n","\n\r","\r"),"\n",$str)
);
Ce qui se passe c'est:
Les sauts de ligne pouvant prendre différentes formes, je str_replace
\r\n,\n\r et\r avec\n à la place (\ n et le\n sont préservés).
Puis exploser sur \n
et vous avez toutes les lignes d’un tableau.
J'ai fait un point de repère sur le src de cette page et divisé les lignes 1000 fois dans une boucle for et:preg_replace
a pris une moyenne de 11 secondesstr_replace & explode
a pris une moyenne d'environ 1 seconde
Plus de détails et d'informations sur Bencmark sur mon forum
David: Super direction, mais vous avez manqué. cela a fonctionné pour moi:
$array = preg_split("/(\r\n|\n|\r)/", $string);
Vous n'avez pas besoin de fonctions preg_ *, ni de patterns de preg, ni de str_replace dans, etc. Dans tous les scénarios, que ce soit Linux/Mac ou m $, cela conviendra.
<?php
$array = explode(PHP_EOL, $string);
// ...
$string = implode(PHP_EOL, $array);
?>
PHP_EOL est une constante contenant le ou les caractères de saut de ligne utilisés par la plate-forme du serveur.
explode("\n", $str);
Le "(au lieu de ') est assez important, sinon le saut de ligne ne serait pas interprété.
<anti-answer>
Comme d'autres réponses l'ont précisé, veillez à utiliser explode
plutôt que split
car à partir de PHP 5.3.0 split
est obsolète. Ce qui suit estPASla façon dont vous voulez le faire:
$your_array = split(chr(10), $your_string);
LF = "\ n" = chr (10), CR = "\ r" = chr (13)
</anti-answer>
StackOverflow ne me permet pas de commenter la réponse de hesselbom (réputation insuffisante), alors j'ajoute la mienne ...
$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);
Cela a fonctionné au mieux pour moi, car cela élimine automatiquement les espaces blancs de début (deuxième) et de fin (premier), tout en ignorant les lignes vides (le drapeau PREG_SPLIT_NO_EMPTY).
- = OPTIONS = -
Si vous voulez rester en tête, supprimez simplement le second\s * et faites-en un rtrim () à la place ...
$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);
Si vous devez conserver des lignes vides, supprimez les indicateurs NULL (il ne s'agit que d'un espace réservé) et PREG_SPLIT_NO_EMPTY, comme si ...
$array = preg_split('/\s*\R\s*/', trim($text));
Ou garder les deux espaces et les lignes vides ...
$array = preg_split('/\s*\R/', rtrim($text));
Je ne vois aucune raison pour laquelle vous voudrez peut-être conserver les espaces, alors je suggère de laisser le premier\s * dedans. Mais si tout ce que vous voulez, c'est diviser par une nouvelle ligne (comme le titre l'indique), c'est CE simple (comme l'a mentionné Jan Goyvaerts) ...
$array = preg_split('/\R/', $text);
Pour tous ceux qui essaient d'afficher des tâches dans une crontab et qui sont frustrés par la séparation de chaque ligne, utilisez exploser:
$output = Shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);
utiliser '\ n' ne semble pas fonctionner mais chr (10) fonctionne bien: D
j'espère que cela sauvera des maux de tête à quelqu'un.
Vous pouvez faire un $ string = nl2br ($ string) pour que votre saut de ligne soit changé en
<br />.
De cette façon, peu importe que le système utilise\r\n ou\n ou\r
Ensuite, vous pouvez le nourrir dans un tableau:
$array = explode("<br />", $string);
vous pouvez utiliser ceci:
\str_getcsv($str,PHP_EOL);
Ramassé ceci dans les documents php:
<?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";
}
true 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
Intégrer en ligne:
body, html, iframe {
width: 100% ;
height: 100% ;
overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>
Utiliser uniquement le package 'base' est également une solution pour les cas simples:
> 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)
Cette méthode fonctionne toujours pour moi:
$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'])));
C'est ma façon:
$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);
Cela évitera également toutes les lignes vides.