2011-02-12 8 views
20

que tiene un analizador de PHP que divide una cadena dada por saltos de línea, haciendo algo como esto:¿Cuándo uso PHP_EOL en lugar de n y viceversa? Ajax/Jquery problema del cliente

$lines = explode(PHP_EOL,$content); 

El analizador funciona bien cuando se trabaja en el lado del servidor. Sin embargo, cuando paso el contenido por correo ajax (usando el método $ .post de jquery) surge el problema: los saltos de línea no se reconocen. Así que después de casi una hora de pruebas y dolores de cabeza, decidí cambiar PHP_EOL por "\ n" y funcionó:

$ lines = explode ("\ n", $ contenido);

¡Ahora funciona! ¡Maldita sea, he perdido tanto tiempo! ¿Alguien podría explicarme cuándo uso PHP_EOL y "\ n" correctamente, así puedo ahorrar tiempo en el futuro? Apreciar sus amables respuestas;)

+3

'PHP_EOL' cambia dependiendo del sistema de archivos subyacente. – drudge

+4

posible duplicado de [¿Cuándo uso la constante de PHP "PHP_EOL"?] (Http://stackoverflow.com/questions/128560/when-do-i-use-the-php-constant-php-eol) – mario

Respuesta

37

En general, la constante PHP_EOL se debe utilizar para la salida específica de la plataforma.

  • Principalmente para archivo de salida realmente.
  • En realidad, las funciones de archivos ya transforman \n ← → \r\n en sistemas Windows a menos que se utilicen en el modo binario fopen(…, "wb").

Para de entrada de archivo se debe preferir \n sin embargo. Si bien se supone que la mayoría de los protocolos de red (HTTP) usan \r\n, eso no está garantizado.

  • Por lo tanto lo mejor es romper el \n y eliminar cualquier opcional \r manualmente:

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

    O utilice la función file(…, FILE_IGNORE_NEW_LINES) de inmediato, para dejar el manejo de PHP o auto_detect_line_endings EOL.

  • Una alternativa más robusta y más concisa está utilizando preg_split() y una expresión regular:

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

    El \R placeholder detecta cualquier combinación de \ r + \ n. Por lo tanto, sería más seguro e incluso funcionaría para los archivos de texto Classic MacOS ≤ 9 (raramente vistos en la práctica).

    obligatorio nota microoptimization:
    Mientras expresión regular tiene un costo, es sorprendente frecuencia más rápida que los bucles manuales y post-procesamiento de cadena en PHP.

Y hay algunos ejemplos clásicos donde se debe evitar PHP_EOL debido a su platform-ambiguity:

Manual
  • generación de cargas útiles de la red de protocolo, tales como HTTP a través de fsockopen().
  • Para mail() y construcción MIME (que realmente, no deberías hacer tediosamente tú mismo de todos modos).
  • de salida del archivo, si desea consistentemente escritura sólo Unix \n saltos de línea, independientemente del medio ambiente.

a fin de utilizar una combinación "\r\n" literal cuando no está escrito a los archivos, pero la preparación de datos para un contexto específico que espera saltos de línea de red.

+3

Cuidado que los viejos Mac usan '\ r', esta sería una mejor solución:' preg_replace ('~ \ r \ n? ~', "\ n", $ str); '. –

4

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 tiene un servidor de Windows.

Si estaba 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 garantizar que se reconozcan los saltos de línea.

7

PHP_EOL se debe utilizar al escribir resultados como archivos de registro.

Producirá el salto de línea específico para su plataforma.

2

PHP_EOL es la terminación de línea utilizada por el servidor en el que PHP se está ejecutando. El contenido enviado por el usuario probablemente tendrá finalización de línea en cualquier formato que use. Sin embargo, en lugar de explotar en nuevas líneas, simplemente usando la función file(), hace exactamente lo que está buscando.

0

mi humilde opinión utilizando PHP_EOL es preferible

garantizar la coherencia entre PHP y JS manejo de salto de línea, es posible que desee para definir la variable de fin de línea en JS usando PHP_EOL

var eol = '<?php echo str_replace(array("\n","\r"),array('\\n','\\r'),PHP_EOL) ?>'; 

después, el uso eol para dividir contenido textarea enviado

+0

este es un buen fragmento de código para mostrar cómo puede "exportar" los valores del lado del servidor a JS. pero todo el tema de los saltos de línea es mucho más complicado, ya que este hilo muestra [link] (http://stackoverflow.com/questions/6833269/javascript-platform-independent-line-separator) –

+0

¿Por qué el valor del lado del servidor? de 'PHP_EOL' ser significativo en el lado del cliente? – alex

Cuestiones relacionadas