Comment puis-je mettre des chaînes dans un tableau, divisé par une nouvelle ligne?

220

J'ai une chaîne avec des sauts de ligne dans ma base de données. Je veux convertir cette chaîne en un tableau, et pour chaque nouvelle ligne, sauter une place d'index dans le tableau.

Si la chaîne est:

My text1
My text2
My text3

Le résultat que je veux est le suivant:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Johan
la source
1
Je ne connais pas PHP mais il y a généralement une fonction appelée "split" pour les chaînes. Cela fonctionne comme ceci: array = split (string, "\ n")
Sedat Kapanoglu
Vous devriez probablement normaliser les nouvelles lignes en premier. La méthode s($yourString)->normalizeLineEndings()est disponible avec github.com/delight-im/PHP-Str (bibliothèque sous licence MIT) qui a beaucoup d'autres aides de chaîne utiles. Vous voudrez peut-être jeter un œil au code source.
caw

Réponses:

290

Vous pouvez utiliser la explodefonction 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 \nest en fait interprété comme un saut de ligne.
(Voir cette page de manuel pour plus de détails.)

Pascal MARTIN
la source
52
Au lieu de cela, \nvous pouvez utiliser la constante prédéfinie PHP_EOL.
Tim
40
Soyez prudent avec cette solution, car elle ne fonctionne pas sur toutes les nouvelles lignes. J'ai eu le plus de succès avec la réponse de David
Maurice
1
Vous devez diviser à \ n ou \ r pour pouvoir gérer toutes sortes de textes - cela ne fonctionnera qu'avec les nouvelles lignes Linux et Windows. Les nouvelles lignes Mac ne seront pas prises en compte! (\ r)
Steve Horvath
1
Je suppose que la réponse / le commentaire de Tims n'est pas correct, car cela ne correspondra qu'au saut de ligne de VOTRE système, mais lorsque vous obtenez des chaînes qui ont des sauts de ligne d'autres systèmes, cela ne fonctionnera pas! J'ai eu ce problème avec les courriels
Asara
7
Non cette réponse et les commentaires sur cette réponse sont faux! Parce que cela ne tient pas compte du caractère de nouvelle ligne du système d'exploitation, surtout pas PHP_EOL. Vous devez utiliser preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84
331

Je l'ai toujours utilisé avec beaucoup de succès:

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

(mis à jour avec la version finale, merci @LobsterMan)

David
la source
11
Cette réponse devrait être en haut au lieu de celle de Pascal. Celui-là n'a pas fonctionné sur tous les cas.!
Jithesh Kt
1
Telle est la réponse. Celui validé est FAUX. Eh bien, hesselbom l'a aussi ... Vous pouvez également utiliser cet équivalent: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); pour la beauté :) Pourquoi est-ce la seule bonne réponse? Parce que vous ne pouvez pas supposer quel type de fin de ligne vous obtiendrez: Mac (\ r), Windows (\ r \ n) ou Unix (\ n).
Ninj
2
\R matchs \n , \ret\r\n
mpen
1
Ou plus court/\r?\n/
Jason Schilling
Cet exemple est correct car vous ne pouvez pas simplement effectuer une opération de fractionnement basée uniquement sur un seul caractère. Si vous le faites, en vous déclenchant sur '\ r' ou '\ n', vous vous retrouverez avec une ligne vide superflue en cas de fin "\ r \ n" de Windows. Et il est important que le séparateur Windows à deux caractères soit testé en premier.
AndresRohrAtlasInformatik
281

Un saut de ligne est défini différemment sur différentes plates-formes, \ r \ n, \ r ou \ n.

En utilisant RegExp pour diviser la chaîne, vous pouvez faire correspondre les trois avec \ R

Donc pour votre problème:

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

Cela correspondrait à des sauts de ligne sur Windows, Mac et Linux!

hesselbom
la source
3
J'ai également utilisé cela au lieu de la réponse acceptée et de toute autre réponse sur ce fil. Laissant juste ce commentaire à titre informatif.
Seth Malaki
3
En fait, cela n'a pas fonctionné pour moi. Parfois, des sauts de ligne étaient toujours présents dans les clés du tableau.
Maurice
32
Il suffit d'utiliser$array = preg_split ('/\R/', $string);
Jan Goyvaerts
18
Ne fonctionne pas parfois! preg_split("/\r\n|\n|\r/", $string)meilleur choix
Alexey B.
34

PHP connaît déjà les caractères de nouvelle ligne du système actuel. Utilisez simplement la constante EOL.

explode(PHP_EOL,$string)
voidstate
la source
18
Oui, mais on peut éditer un fichier ou comme dans cet exemple une entrée db dans Windows puis l'utiliser sur un système Linux, par exemple. Je pense qu'une approche générale conviendrait mieux.
Cranio
Je ne suis pas sûr que ce soit vrai. Si une zone de texte sur une page Web est soumise, elle peut avoir différents caractères de fin de ligne en fonction du navigateur de l'utilisateur et non du système d'exploitation du serveur. Donc, peu importe le système d'exploitation que vous utilisez, vous devrez pouvoir analyser quoi que ce soit. Cela suppose bien sûr que vous fassiez du Web.
Magmatic
Vous devrez peut-être ensuite utiliser trim()les chaînes résultantes pour supprimer tout espace blanc superflu.
Tim
30

Une alternative à la réponse de David qui est plus rapide (beaucoup plus rapide) est d'utiliser str_replaceet explode.

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

Ce qui se passe est le suivant: les
sauts de ligne pouvant prendre différentes formes, je str_replace\ r \ n, \ n \ r et \ r avec \ n à la place (et l'original \ n est conservé).
Ensuite, explosez \net vous avez toutes les lignes dans un tableau.

J'ai fait un benchmark sur le src de cette page et divisé les lignes 1000 fois dans une boucle for et: a
preg_replacepris une moyenne de 11 secondes a
str_replace & explodepris une moyenne d'environ 1 seconde

Plus de détails et d'informations sur mon forum sur mon forum

Roseau
la source
Votre lien vers le forum (et l'ensemble du domaine) semble être en panne
Nikita
19

David: Grande direction, mais vous avez manqué \ r. cela a fonctionné pour moi:

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

Vous n'avez pas besoin des fonctions preg_ * ni des motifs preg ni str_replace dedans, etc. pour casser avec succès une chaîne en tableau par des sauts de ligne. Dans tous les scénarios, que ce soit Linux / Mac ou m $, cela suffira.

<?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 serveur.

Effrayant
la source
3
le fichier pourrait provenir d'un autre système avec différentes nouvelles lignes, en particulier dans un environnement net pour lequel PHP est utilisé
Luca C.
C'est exactement la raison pour laquelle cette constante existe .. et gère ce problème particulier.
Spooky
si vous prenez un fichier sous Windows, il ne correspond pas à un fichier sous unix ou mac, n'est-ce pas?
Luca C.
Si vous utilisez pure utf-8 tout le temps, partout, les fichiers utf8 sont inclus, normalement, et que vous n'avez rien d'autre que PHP_EOL dans le code de vôtre pour les détections de saut de ligne, il sera mis en correspondance comme décrit, et aucun comportement imprévu ne se produira. Gardez à l'esprit que ce n'est pas seulement moi qui crie et le réclame. La convivialité de PHP_EOL est assez confirmée.
Spooky
1
Dans votre cas, si les sources viennent d'ailleurs et ne sont pas bien formées, quoi qu'il en soit, c'est peut-être mieux si vous utilisez str_replace (plus rapide que regexp). ... dans l'ensemble, que ce soit regexp. ou str_replace ou PHP_EOL, il y a une bonne vieille phrase disant: "Si ça marche - ne le touchez pas!". :)
Spooky
9
explode("\n", $str);

Le "(au lieu de ') est assez important car sinon, le saut de ligne ne sera pas interprété.

Damien MATHIEU
la source
9

StackOverflow ne me permettra pas de commenter la réponse de hesselbom (pas assez de réputation), donc j'ajoute la mienne ...

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

Cela a fonctionné le mieux pour moi car il élimine également automatiquement les espaces de début (deuxième \ s *) et de fin (premier \ s *) et ignore également les lignes vides (l'indicateur PREG_SPLIT_NO_EMPTY).

- = OPTIONS = -

Si vous voulez garder les espaces blancs en tête, débarrassez-vous simplement du second \ s * et faites-en plutôt un rtrim () ...

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

Si vous devez conserver des lignes vides, débarrassez-vous du drapeau NULL (ce n'est qu'un espace réservé) et PREG_SPLIT_NO_EMPTY, comme ça ...

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

Ou en gardant à la fois les espaces blancs et les lignes vides ...

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

Je ne vois aucune raison pour laquelle vous voudriez toujours garder un espace blanc, donc je suggère de laisser le premier \ s * là-dedans. Mais, si tout ce que vous voulez est de diviser par nouvelle ligne (comme le titre le suggère), c'est CECI simple (comme mentionné par Jan Goyvaerts) ...

$array = preg_split('/\R/', $text);
Deen Foxx
la source
Le mmodificateur n'est pas vraiment nécessaire, n'est-ce pas? Cela n'affecte-t-il pas seulement ^et $?
mpen
@mpen Oui, je pense que vous avez raison. Je l'ai juste emporté avec la version de hesselbom. Je vais modifier mon message.
Deen Foxx
7
<anti-answer>

Comme d'autres réponses l'ont spécifié, assurez-vous de l'utiliser explodeplutôt que splitparce que PHP 5.3.0 splitest obsolète. c'est-à-dire que ce n'est PAS la façon dont vous voulez le faire:

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

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

</anti-answer>
À M
la source
3

Pour ceux qui essaient d'afficher des tâches cron dans une table crontab et qui sont frustrés de la façon de séparer chaque ligne, utilisez explode:

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

l'utilisation de '\ n' ne semble pas fonctionner mais chr (10) fonctionne bien: D

j'espère que cela vous évitera quelques maux de tête.

Jeff
la source
Salut Jeff, bienvenue à SO. Vous devriez réécrire ceci comme une question et une réponse, plutôt que comme une réponse à la question de quelqu'un d'autre. Il s'agit d'un site de questions / réponses, pas d'un forum général. Jetez un œil à la FAQ - stackoverflow.com/faq
Rebecca Scott
L'utilisation '\n'ne fonctionne pas car les séquences d'échappement ne sont pas interprétées entre guillemets simples, vous devez utiliser des guillemets doubles à la place: "\n"au lieu de 'n'Lire php.net/manual/en/language.types.string.php
Christopher K.
2

vous pouvez utiliser ceci:

 \str_getcsv($str,PHP_EOL);
parisssss
la source
2

Vous pouvez faire un $ string = nl2br ($ string) pour que votre saut de ligne soit changé en

<br />. 

De cette façon, peu importe si le système utilise \ r \ n ou \ n ou \ r

Ensuite, vous pouvez le nourrir dans un tableau:

$array = explode("<br />", $string);
Sandor
la source
Remarque: nl2br ne remplace pas les sauts de ligne ... il insère uniquement une balise de coupure avant chaque saut de ligne. Ainsi, tous vos éléments de tableau autres que le premier commenceront par un saut de ligne. Si cela ne vous concerne pas, cette méthode est la plus rapide. Si cela importe, la réponse de Jakar est la plus rapide.
Aust
2

C'est ma façon:

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

Cela sautera également toutes les lignes vides.

Axel
la source
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";
}

vrai tableau:

$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>

antelove
la source
Ajoutez une explication avec une réponse pour savoir comment cette réponse aide OP à résoudre le problème actuel
ρяσѕρєя K
1

Ramassé cela 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);
?>
korwalskiy
la source
0

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

la source
1
J'adore la prestation de serment dans le cadre du code. :) Quoi qu'il en soit, le remplacement par \ n est plus simple et plus sûr (regardez les autres réponses).
Stefan Reich
0

Utiliser uniquement le package «de 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)
Roque
la source
-6

En utilisant n'importe quel caractère spécial entre la chaîne ou le saut de ligne à l' \naide de l'explosion PHP, nous pouvons y parvenir.

yasin
la source