Dividir cadena por caracteres de nueva línea

Resuelto Johan asked hace 54 años • 19 respuestas

Tengo una cadena con caracteres de nueva línea. Quiero convertir esa cadena en una matriz y, por cada nueva línea, 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
)
Johan avatar Jan 01 '70 08:01 Johan
Aceptado

Siempre he usado esto con gran éxito:

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

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

David avatar Jun 22 '2012 23:06 David

Puedes usar la explodefunció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 este resultado:

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 una cadena entre comillas dobles , por lo que \nen realidad se interpreta como un salto de línea.
(Consulte esa página del manual para obtener más detalles).

Pascal MARTIN avatar Sep 27 '2009 12:09 Pascal MARTIN

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

Usando RegExp para dividir la cadena, puedes 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!

hesselbom avatar Sep 21 '2011 11:09 hesselbom

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

explode(PHP_EOL,$string)
voidstate avatar Sep 07 '2012 12:09 voidstate

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

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

Lo que está sucediendo es:
dado que los saltos de línea pueden tener diferentes formas, I str_replace\r\n, \n\r y \r con \n en su lugar (y se conserva el \n original).
Luego explota \ny tendrás todas las líneas en una matriz.

Hice una prueba comparativa en el src de esta página y dividí las líneas 1000 veces en un bucle for y:
preg_replacetomé un promedio de 11 segundos
str_replace & explodetomé un promedio de aproximadamente 1 segundo

Más detalles e información comparativa en mi foro.

Reed avatar Feb 25 '2015 17:02 Reed