¿Cómo reemplazar diferentes estilos de nueva línea en PHP de la manera más inteligente?

Tengo un texto que podría tener diferentes estilos de nueva línea. Quiero reemplazar todas las líneas nuevas ‘\ r \ n’, ‘\ n’, ‘\ r’ con la misma nueva línea (en este caso, \ r \ n).

¿Cuál es la forma más rápida de hacer esto? Mi solución actual se ve así, que es muy sucky:

$sNicetext = str_replace("\r\n",'%%%%somthing%%%%', $sNicetext); $sNicetext = str_replace(array("\r","\n"),array("\r\n","\r\n"), $sNicetext); $sNicetext = str_replace('%%%%somthing%%%%',"\r\n", $sNicetext); 

El problema es que no puede hacer esto con un reemplazo porque el \ r \ n se duplicará en \ r \ n \ r \ n.

¡Gracias por tu ayuda!

 $string = preg_replace('~\R~u', "\r\n", $string); 

Si no quiere reemplazar todas las líneas nuevas de Unicode, sino solo las de estilo CRLF, use:

 $string = preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", $string); 

\R coincide con estas nuevas líneas, u es un modificador para tratar la cadena de entrada como UTF-8.


De los documentos PCRE :

Qué \R coincide

Por defecto, la secuencia \ R en un patrón coincide con cualquier secuencia de nueva línea Unicode, cualquiera que haya sido seleccionada como la secuencia final de línea. Si especifica

  --enable-bsr-anycrlf 

el valor predeterminado se cambia para que \ R coincida solo con CR, LF o CRLF. Lo que se selecciona cuando se crea PCRE puede anularse cuando se invocan las funciones de la biblioteca.

y

Secuencias de Newline

Fuera de una clase de caracteres, de forma predeterminada, la secuencia de escape \ R coincide con cualquier secuencia de nueva línea Unicode. En el modo no UTF-8, \ R es equivalente a lo siguiente:

  (?>\r\n|\n|\x0b|\f|\r|\x85) 

Este es un ejemplo de un “grupo atómico”, cuyos detalles se detallan a continuación. Este grupo particular coincide con la secuencia de dos caracteres CR seguida de LF, o uno de los caracteres individuales LF (salto de línea, U + 000A), VT (pestaña vertical, U + 000B), FF (avance de forma, U + 000C), CR (retorno de carro, U + 000D) o NEL (línea siguiente, U + 0085). La secuencia de dos caracteres se trata como una sola unidad que no se puede dividir.

En el modo UTF-8, se agregan dos caracteres adicionales cuyos puntos de código son mayores que 255: LS (separador de línea, U + 2028) y PS (separador de párrafo, U + 2029). El soporte de propiedades de caracteres Unicode no es necesario para que estos caracteres sean reconocidos.

Es posible restringir \ R para que coincida solo con CR, LF o CRLF (en lugar del conjunto completo de terminaciones de línea Unicode) configurando la opción PCRE_BSR_ANYCRLF en el momento de la comstackción o cuando el patrón se corresponde. (BSR es una abreviatura para “barra invertida R”). Esto se puede hacer de manera predeterminada cuando se construye PCRE; si este es el caso, el otro comportamiento se puede solicitar a través de la opción PCRE_BSR_UNICODE. También es posible especificar estas configuraciones comenzando una cadena de patrones con una de las siguientes secuencias:

  (*BSR_ANYCRLF) CR, LF, or CRLF only (*BSR_UNICODE) any Unicode newline sequence 

Estos anulan el valor predeterminado y las opciones dadas a pcre_compile () o pcre_compile2 (), pero pueden ser reemplazados por opciones dadas a pcre_exec () o pcre_dfa_exec (). Tenga en cuenta que estas configuraciones especiales, que no son compatibles con Perl, se reconocen solo desde el inicio de un patrón y deben estar en mayúsculas. Si hay más de uno presente, se usa el último. Se pueden combinar con un cambio de convención de nueva línea; por ejemplo, un patrón puede comenzar con:

  (*ANY)(*BSR_ANYCRLF) 

También se pueden combinar con las secuencias especiales (* UTF8) o (* UCP). Dentro de una clase de caracteres, \ R se trata como una secuencia de escape no reconocida, por lo que coincide con la letra “R” de forma predeterminada, pero provoca un error si se establece PCRE_EXTRA.

Para normalizar nuevas líneas, siempre uso:

 $str = preg_replace('~\r\n?~', "\n", $str); 

Reemplaza las líneas nuevas de Mac ( \r ) y Windows ( \r\n ) con el equivalente de Unix ( \n ).

Prefiero usar \n porque solo toma un byte en lugar de dos, pero puedes cambiarlo fácilmente a \r\n .

Qué tal si

 $sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext); 

Creo que la forma más inteligente / simple de convertir a CRLF es:

 $output = str_replace("\n", "\r\n", str_replace("\r", '', $input)); 

para convertir a LF solamente:

 $output = str_replace("\r", '', $input); 

es mucho más fácil que las expresiones regulares.