Dividir cadena por caracteres de nueva línea
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
)
Siempre he usado esto con gran éxito:
$array = preg_split("/\r\n|\n|\r/", $string);
(actualizado con el \r final, gracias @LobsterMan)
Puedes usar la 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 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 \n
en realidad se interpreta como un salto de línea.
(Consulte esa página del manual para obtener más detalles).
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!
PHP ya conoce los caracteres de nueva línea del sistema actual. Simplemente use la constante EOL.
explode(PHP_EOL,$string)
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",$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 \n
y 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_replace
tomé un promedio de 11 segundos
str_replace & explode
tomé un promedio de aproximadamente 1 segundo
Más detalles e información comparativa en mi foro.