web-dev-qa-db-fra.com

Quand dois-je utiliser PHP_EOL au lieu de\n et vice-versa? Problème client Ajax/Jquery

J'ai un analyseur php qui scinde une chaîne donnée par des sauts de ligne, faisant quelque chose comme ceci:

$lines = explode(PHP_EOL,$content);

L'analyseur fonctionne bien lorsque vous travaillez côté serveur. Cependant, lorsque je transmets le contenu via post par ajax (en utilisant la méthode $ .post de jquery), le problème se pose: les sauts de ligne ne sont pas reconnus. Donc, après presque une heure de tests et de maux de tête, j'ai décidé de changer PHP_EOL par "\ n" et cela a fonctionné:

$ lignes = exploser ("\ n", $ contenu);

Maintenant ça marche! Bon sang j'ai perdu tellement de temps! Quelqu'un pourrait-il m'expliquer quand j'utilise PHP_EOL et "\ n" correctement, afin de gagner du temps? Appréciez vos gentilles réponses;)

21
fabio

La constante PHP_EOL doit généralement être utilisée pour les sorties spécifiques à la plate-forme.

  • Principalement pour la sortie du fichier vraiment.
  • En réalité, les fonctions de fichier transforment déjà \n ← → \r\n sur les systèmes Windows, sauf si elles sont utilisées en mode binaire fopen(…, "wb").

Pour entrée de fichier , préférez toutefois \n. Alors que la plupart des protocoles réseau (HTTP) sont supposés utiliser \r\n, ce n'est pas garanti.

  • Par conséquent, il est préférable de rompre avec \n et de supprimer manuellement tout \r facultatif:

    $lines = array_map("rtrim", explode("\n", $content));
    

    Ou utilisez immédiatement la fonction file(…, FILE_IGNORE_NEW_LINES) , pour laisser la gestion des EOL sur PHP ou auto_detect_line_endings .

  • Une alternative plus robuste et plus floue utilise preg_split() et une expression rationnelle:

    $lines = preg_split("/\R/", $content);
    

    Le \R espace réservé détecte toute combinaison de \r + \n. Donc, serait plus sûr, et même de travailler pour les fichiers texte Classic MacOS ≤ 9 (rarement vu dans la pratique).

    Note de microoptimisation obligatoire:
    Bien que regex ait un coût, il est étonnamment souvent plus rapide que les boucles manuelles et le post-traitement des chaînes en PHP.

Et il y a quelques exemples classiques où vous devriez éviter PHP_EOL en raison de son plate-forme-ambiguïté :

  • Génération manuelle de charges utiles de protocole réseau, telles que HTTP over fsockopen() .
  • Pour mail() et la construction MIME (ce qui en fait, vous ne devriez pas vous occuper fastidieusement de toute façon).
  • Sortie de fichier, si vous voulez constamment n'écrivez que des nouvelles lignes Unix \n quel que soit l'environnement.

Utilisez donc une combinaison littérale "\r\n" lorsque vous n’écrivez pas dans des fichiers, mais préparez des données pour un contexte spécifique qui attend des sauts de ligne sur le réseau .

41
mario

PHP_EOL doit être utilisé lors de l'écriture d'une sortie telle que les fichiers journaux.

Il produira le saut de ligne spécifique à votre plate-forme.

9
alex

PHP_EOL est une constante contenant le ou les caractères de saut de ligne utilisés par la plate-forme du serveur. Dans le cas de Windows, il s'agit de \r\n. Sur * nix, c'est \n. Vous avez apparemment un serveur Windows.

Si vous étiez sur un serveur * nix, cette modification ne l'aurait pas corrigé, car ce serait \n. Si vous envoyez des données au client (c'est-à-dire au navigateur), vous devez utiliser \r\n pour vous assurer que les sauts de ligne sont reconnus.

5
Jonah

PHP_EOL est la fin de ligne utilisée par le serveur sur lequel PHP est en cours d'exécution. Le contenu soumis par l'utilisateur aura probablement une ligne se terminant dans le format utilisé. Cependant, au lieu d'exploser en nouvelles lignes, en utilisant simplement la fonction file(), il fait exactement ce que vous recherchez.

2
mfonda