Tengo un analizador php que divide una cadena dada por saltos de línea, haciendo algo como esto:
$lines = explode(PHP_EOL,$content);El analizador funciona bien cuando se trabaja en el lado del servidor. Sin embargo, cuando paso el contenido por publicación mediante ajax (usando el método $.post de jquery) surge el problema: no se reconocen los saltos de línea. Entonces, después de casi una hora de pruebas y dolores de cabeza, decidí cambiar PHP_EOL por "\n" y funcionó:
$líneas = explotar("\n",$contenido);
¡Ahora funciona! ¡Maldita sea, perdí tanto tiempo! ¿Alguien podría explicarme cuándo usar PHP_EOL y "\n" correctamente, para poder ahorrar tiempo en el futuro? Agradezco sus amables respuestas ;)
La constante PHP_EOL generalmente se debe usar para la salida específica de la plataforma.
\n ←→ \r\n en sistemas Windows a menos que se usen en modo binario fopen(…, "wb") . Sin embargo, para la entrada de archivos , debe preferir \n . Si bien se supone que la mayoría de los protocolos de red (HTTP) usan \r\n , eso no está garantizado.
Por lo tanto, es mejor dividir en \n y eliminar manualmente cualquier \r opcional:
$lines = array_map("rtrim", explode("\n", $content)); O use la función file(…, FILE_IGNORE_NEW_LINES) de inmediato, para dejar el manejo de EOL a PHP o auto_detect_line_endings .
Una alternativa más robusta y concisa es usar preg_split() y una expresión regular:
$lines = preg_split("/\R/", $content); El marcador de posición \R detecta cualquier combinación de \r + \n . Por lo tanto, sería más seguro e incluso funcionaría para archivos de texto ≤ 9 de MacOS clásico (rara vez se ve en la práctica).
Nota de microoptimización obligatoria:
Si bien la expresión regular tiene un costo, sorprendentemente a menudo es más rápida que los bucles manuales y el posprocesamiento de cadenas en PHP.
Y hay algunos ejemplos clásicos en los que debe evitar PHP_EOL debido a su ambigüedad de plataforma :
fsockopen() .mail() y MIME (que en realidad, no deberías hacer tediosamente tú mismo de todos modos).\n independientemente del entorno. Por lo tanto, use una combinación literal "\r\n" cuando no escriba en archivos, pero prepare datos para un contexto específico que espera saltos de línea de red .
PHP_EOL debe usarse al escribir resultados como archivos de registro.
Producirá el salto de línea específico para su plataforma.
PHP_EOL es una constante que contiene los caracteres de salto de línea utilizados por la plataforma del servidor. En el caso de Windows, es \r\n . En *nix, es \n . Aparentemente tienes un servidor de Windows.
Si estuviera en un servidor * nix, ese cambio no lo habría solucionado, porque sería \n . Si está enviando datos al cliente (es decir, el navegador), debe usar \r\n para asegurarse de que se reconozcan los saltos de línea.