257 votes

Comment mettre des chaînes de caractères dans un tableau, séparées par une nouvelle ligne ?

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 d'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
)

0 votes

Vous devriez probablement commencer par normaliser les nouvelles lignes. 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 utiles pour les chaînes de caractères. Vous pouvez jeter un coup d'oeil au code source.

402voto

David Points 1349

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

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

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

15 votes

Cette réponse devrait être en haut à la place de celle de Pascal. Celle-ci n'a pas fonctionné sur tous les cas !

1 votes

Voici la réponse. Celui qui a été validé est FAUX. Eh bien, hesselbom l'a aussi... Vous pourriez aussi utiliser cet équivalent : preg_split('/ \n | \r /', $string, -1, PREG_SPLIT_NO_EMPTY) ; pour faire joli :) Pourquoi est-ce la seule bonne réponse ? Parce que vous ne pouvez pas présumer du type de fin de ligne que vous obtiendrez : Mac ( \r ), Windows ( \r\n ), ou Unix ( \n ).

11 votes

\R correspond à \n , \r y \r\n

322voto

Pascal MARTIN Points 195780

Vous pouvez utiliser le explode en utilisant la fonction " \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 ce résultat :

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)

Notez que vous devez utiliser un chaîne de caractères doublement citée donc \n est en fait interprété comme un saut de ligne.
(Voir cette page du manuel pour plus de détails).

0 votes

Même si c'est simple, vous l'avez parfaitement expliqué.

61 votes

Au lieu de \n vous pouvez utiliser la constante prédéfinie PHP_EOL .

45 votes

Soyez tous prudents avec cette solution, car elle ne fonctionne pas sur toutes les nouvelles lignes. C'est avec la réponse de David que j'ai eu le plus de succès.

289voto

hesselbom Points 1747

Un saut de ligne est défini différemment selon les plateformes, \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 aux sauts de ligne sur Windows, Mac et Linux !

3 votes

J'ai également utilisé cette réponse au lieu de la réponse acceptée et de toutes les autres réponses de ce fil. Je laisse juste ce commentaire à titre informatif.

3 votes

En fait, cela n'a pas fonctionné pour moi. Parfois, les nouvelles lignes étaient encore présentes dans les clés du tableau.

38voto

voidstate Points 4988

PHP connaît déjà le(s) caractère(s) de nouvelle ligne du système actuel. Utilisez simplement la constante EOL.

explode(PHP_EOL,$string)

19 votes

Oui, mais on peut éditer un fichier ou, comme dans cet exemple, une entrée de base de données sous Windows puis l'utiliser sur un système Linux, par exemple. Je pense qu'une approche générale conviendrait mieux.

1 votes

Je ne suis pas sûr que ce soit juste. Si une zone de texte d'une page web est soumise, elle peut avoir des caractères de fin de ligne différents selon le navigateur de l'utilisateur, et non selon le système d'exploitation du serveur. Ainsi, quel que soit le système d'exploitation que vous utilisez, vous devrez être capable d'analyser n'importe quoi. Ceci en supposant que vous fassiez du Web, bien sûr.

0 votes

Vous pourriez alors avoir à utiliser trim() sur les chaînes de caractères résultantes afin de supprimer tout espace blanc superflu.

21voto

LobsterMan Points 466

David a un grande direction mais il a manqué \r. Cela a marché pour moi :

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

0 votes

Le groupe de capture n'est pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X