Dividir cadena por caracteres de nueva línea

8 minutos de lectura

avatar de usuario
johan

Tengo una cadena con caracteres de nueva línea. Quiero convertir esa cadena en una matriz y, por cada línea nueva, saltar un lugar de índice en la matriz.

Si la cadena es:

My text1
My text2
My text3

El resultado que quiero es este:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

  • Deberías normalizar las nuevas líneas primero, probablemente. El método s($yourString)->normalizeLineEndings() está disponible con github.com/delight-im/PHP-Str (biblioteca bajo licencia MIT) que tiene muchos otros ayudantes de cadenas útiles. Es posible que desee echar un vistazo al código fuente.

    – graznido

    25 de julio de 2016 a las 3:23

avatar de usuario
David

Siempre he usado esto con gran éxito:

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

(actualizado con el \r final, gracias @LobsterMan)

  • Esta es la respuesta. El validado es INCORRECTO. Bueno, hesselbom también lo tiene… También puedes usar este equivalente: preg_split(‘/\n|\r/’, $cadena, -1, PREG_SPLIT_NO_EMPTY); por el bien de la belleza 🙂 ¿Por qué esta es la única buena respuesta? Porque no puede asumir qué tipo de final de línea obtendrá: Mac (\r), Windows (\r\n) o Unix (\n).

    – Ninja

    8 de enero de 2015 a las 23:08


  • \R partidos \n, \r y \r\n

    – mpen

    13/10/2016 a las 17:44


  • o más corto /\r?\n/

    – Jason Schilling

    23 oct 2019 a las 16:59

  • Este ejemplo es correcto porque no puede simplemente tomar cualquier operación de división que se base solo en un solo carácter. Si hace eso, activando en ‘\r’ o ‘\n’ terminará con una línea vacía superflua en caso de que Windows termine con “\r\n”. Y es importante que primero se pruebe el separador de Windows de dos caracteres.

    – Andres RohrAtlas Informatik

    14 de febrero de 2020 a las 10:56


avatar de usuario
Pascal MARTÍN

Puedes usar el explode función, usando “\n” como separador:

$your_array = explode("\n", $your_string_from_db);

Por ejemplo, si tiene este fragmento de código:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Obtendrías esta salida:

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

Tenga en cuenta que debe utilizar un cadena entre comillas doblesasi que \n en realidad se interpreta como un salto de línea.

(Consulte esa página del manual para obtener más detalles).

  • En vez de \n puedes usar la constante predefinida PHP_EOL.

    – Tim

    19 de julio de 2012 a las 14:58

  • Todos tengan cuidado con esta solución, ya que no funciona en todas las líneas nuevas. He tenido más éxito con la respuesta de David.

    – Mauricio

    29 de agosto de 2012 a las 7:31

  • Debe dividirse en \n o\r para poder manejar todo tipo de textos; esto solo funcionará con líneas nuevas de Linux y Windows. ¡Se ignorarán las nuevas líneas de Mac! (\r)

    –Steve Horvath

    2 de junio de 2016 a las 1:30

  • Supongo que la respuesta/comentario de Tim no es correcto, porque esto solo coincidirá con el salto de línea de SU sistema, pero cuando obtiene cadenas que tienen saltos de línea de otros sistemas, ¡no funcionará! Tenía este problema con los correos electrónicos

    – Asara

    30 de noviembre de 2016 a las 12:20

  • ¡No, esta respuesta y los comentarios sobre esta respuesta están INCORRECTOS! Debido a que esto no tiene en cuenta el carácter de nueva línea del sistema operativo, especialmente no PHP_EOL. Debes usar preg_split("/\\r\\n|\\r|\\n/", $value).

    – kjdion84

    18 de septiembre de 2017 a las 15:24

Un salto de línea se define de manera diferente en diferentes plataformas, \r\n, \r o \n.

Usando RegExp para dividir la cadena, puede hacer coincidir los tres con \R

Entonces para tu problema:

$array = preg_split ('/$\R?^/m', $string);

¡Eso coincidiría con los saltos de línea en Windows, Mac y Linux!

  • También usé esto en lugar de la respuesta aceptada y cualquier otra respuesta en este hilo. Solo dejo este comentario a modo informativo.

    – Seth Malaki

    1 de junio de 2012 a las 12:55

  • En realidad, esto no funcionó para mí. A veces, las nuevas líneas todavía están presentes en las claves de matriz.

    – Mauricio

    29 de agosto de 2012 a las 7:29

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

    – hakré

    23 de diciembre de 2012 a las 14:24

  • Solo usa $array = preg_split ('/\R/', $string);

    – Jan Goyvaerts

    15 de febrero de 2013 a las 3:42

  • ¡A veces no funciona! preg_split("/\r\n|\n|\r/", $string) mejor elección

    – Alexei B.

    28 de agosto de 2013 a las 10:26

PHP ya conoce los caracteres de nueva línea del sistema actual. Simplemente use la constante EOL.

explode(PHP_EOL,$string)

avatar de usuario
Junco

Una alternativa a la respuesta de David que es más rápida (mucho más rápida) es usar str_replace y explode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

Lo que está pasando es:
Dado que los saltos de línea pueden tener diferentes formas, str_replace \r\n, \n\r y \r con \n en su lugar (y se conservan los \n originales).
Entonces explota en \n y tienes todas las líneas en una matriz.

Hice un punto de referencia en el src de esta página y dividí las líneas 1000 veces en un bucle for y:
preg_replace tomó un promedio de 11 segundos
str_replace & explode tomó un promedio de aproximadamente 1 segundo

Más detalles e información de referencia en mi foro

  • El enlace de tu foro (y todo el dominio) parece estar caído

    – Nikita 웃

    29 de julio de 2018 a las 7:58


  • \n\r …¿Qué sistema operativo usa la secuencia de nueva línea al revés de esta manera?

    – mickmackusa

    20 dic 2020 a las 20:51


  • @mickmackusa, ninguno que yo sepa. Fue hace tanto tiempo que no estoy seguro de por qué lo hice de esa manera. Pensando que debería quitar el \n\r?

    – Junco

    20 de diciembre de 2020 a las 21:24

  • Hasta donde yo sé, solo necesitas retener \r\n en la matriz de búsqueda (y para el caso, ya no es necesario que sea una matriz). Estoy interesado en la afirmación de que preg_ fue 11 veces más lento. No incluyeste el patrón que usaste. Su fragmento anterior hace 4 pasadas sobre la entrada. Un bien preg_ técnica hará sólo una pasada sobre la entrada. Regex no es conocido por su velocidad, pero creo que su afirmación requiere justificación. Publique los detalles de su punto de referencia si va a mantener esta afirmación de rendimiento en su respuesta.

    – mickmackusa

    20 dic 2020 a las 22:05

avatar de usuario
Pedro Mortensen

david tiene un gran dirección, pero se perdió \r. Esto funcionó para mí:

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

  • El enlace de tu foro (y todo el dominio) parece estar caído

    – Nikita 웃

    29 de julio de 2018 a las 7:58


  • \n\r …¿Qué sistema operativo usa la secuencia de nueva línea al revés de esta manera?

    – mickmackusa

    20 dic 2020 a las 20:51


  • @mickmackusa, ninguno que yo sepa. Fue hace tanto tiempo que no estoy seguro de por qué lo hice de esa manera. Pensando que debería quitar el \n\r?

    – Junco

    20 de diciembre de 2020 a las 21:24

  • Hasta donde yo sé, solo necesitas retener \r\n en la matriz de búsqueda (y para el caso, ya no es necesario que sea una matriz). Estoy interesado en la afirmación de que preg_ fue 11 veces más lento. No incluyeste el patrón que usaste. Su fragmento anterior hace 4 pasadas sobre la entrada. Un bien preg_ técnica hará sólo una pasada sobre la entrada. Regex no es conocido por su velocidad, pero creo que su afirmación requiere justificación. Publique los detalles de su punto de referencia si va a mantener esta afirmación de rendimiento en su respuesta.

    – mickmackusa

    20 dic 2020 a las 22:05

avatar de usuario
Pedro Mortensen

No necesitas funciones preg_*, embarazada patrones, str_replace dentro, etc. para dividir con éxito una cadena en una matriz mediante saltos de línea. En todos los escenarios, ya sea Linux, Mac o Windows, esto funcionará.

<?php
    $array = explode(PHP_EOL, $string);
    // ...
    $string = implode(PHP_EOL, $array);
?>

PHP_EOL es una constante que contiene los caracteres de salto de línea utilizados por la plataforma del servidor.

  • el archivo podría provenir de otro sistema con diferentes líneas nuevas, particularmente en un entorno de red para el cual se usa PHP

    –Luca C.

    25 de julio de 2016 a las 8:54

  • Que es exactamente la razón por la que existe esta constante… y maneja ese problema en particular.

    – Escalofriante

    28 de julio de 2016 a las 15:14


  • si toma un archivo de Windows, no coincide con un archivo de Unix o Mac, ¿verdad?

    –Luca C.

    28 de julio de 2016 a las 15:53

  • Si está utilizando utf-8 puro todo el tiempo, en todas partes, incluidos los archivos utf8, normalmente, y no tiene nada más que PHP_EOL dentro de su código para la detección de saltos de línea, se comparará como se describe y no se producirá un comportamiento imprevisto. Tenga en cuenta que no soy solo yo quien grita y reclama esto. La usabilidad de PHP_EOL está bastante confirmada.

    – Escalofriante

    28 de julio de 2016 a las 16:04


  • En su caso, si las fuentes provienen de otro lugar y no están bien formadas, lo que sea, tal vez sea mejor si usa str_replace (más rápido que regexp). … en general, ya sea regexp. o str_replace o PHP_EOL, hay una buena frase antigua que dice: “Si funciona, ¡no lo toques!”. 🙂

    – Escalofriante

    29 de julio de 2016 a las 8:18


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad