Explotar cadena PHP por nueva línea

253

Simple, ¿verdad? Bueno, esto no está funcionando: - \

$skuList = explode('\n\r', $_POST['skuList']);
Webnet
fuente
28
Las comillas simples significan "no analizar esta cadena". La respuesta de @ Select0r es probablemente lo que estás buscando.
Ryan Kinal
3
posible duplicado de cómo eliminar nuevas líneas y retornos de la cadena php? que ya era un duplicado de manera confiable líneas noticiosas Sacar de cadena y algunos otros . Utilice la función de búsqueda frugging antes de hacer preguntas por favor!
Gordon
1
@ Gordon: Ja, vi lo que dijo el Coronel Shrapnel en esa otra pregunta. Un poco triste en realidad. Sin embargo, agrego mi voto cercano.
BoltClock
99
Además de las comillas simples emitidas mencionadas por otros, los pares CRLF \r\nno son al revés.
Powerlord
1
Trate de recordar eso: \ R etur \ N
l00k

Respuestas:

410

Mejores prácticas

Como se menciona en el comentario a la primera respuesta, la mejor práctica es usar la constante PHP PHP_EOL que representa la EOL ( Fin de línea ) del sistema actual .

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP proporciona muchas otras constantes muy útiles que puede usar para hacer que su sistema de código sea independiente, consulte este enlace para encontrar constantes de directorio útiles e independientes del sistema.

Advertencia

Estas constantes hacen que su sistema de páginas sea independiente, pero podría tener problemas al pasar de un sistema a otro cuando usa las constantes con datos almacenados en otro sistema. Las constantes del nuevo sistema pueden ser diferentes de las del sistema anterior y los datos almacenados podrían dejar de funcionar. Por lo tanto, analice completamente sus datos antes de almacenarlos para eliminar cualquier parte dependiente del sistema.

ACTUALIZAR

El comentario de Andreas me hizo darme cuenta de que la solución 'Best Practice' que presento aquí no se aplica al caso de uso descrito: la EOL (PHP) del servidor no tiene nada que ver con la EOL que usa el navegador (cualquier sistema operativo), pero ese (el navegador) es de donde proviene la cadena.

Entonces, use la solución de @Alin_Purcaru ( tres abajo ) para cubrir todas sus bases (y votar su respuesta):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Larzan
fuente
55
Esta es una nueva respuesta, pero probablemente sea la mejor y con razón la respuesta aceptada
frazras
Eso es extraño, ya que es la forma en que PHP quiere que lo hagas :) ¿Puedes darme más detalles sobre tu sistema operativo y la versión de PHP, tal vez un fragmento de código en PasteBin o sth? ¿similar?
Larzan
16
No puede usar PHP_EOL porque el sistema y la fuente de entrada no tienen nada que ver entre sí. Si el usuario coloca nuevas líneas en Windows y el PHP se está ejecutando en Linux, el resultado puede estar roto.
barell
1
@barell exactamente, esa es la situación que describo en la parte de 'advertencia';) La pregunta no indicó explícitamente que es una entrada antigua almacenada en la base de datos. Lea la parte de 'advertencia' y verá que cubro esa situación allí.
Larzan
77
Esta respuesta es simplemente incorrecta para este caso de uso. No utilice la constante PHP_EOL en este caso ya que la fuente de entrada (por ejemplo, el navegador del usuario) definitivamente no es su sistema. Use una solución que se encargue de todas las diferentes terminaciones de línea (respuesta de Alin Purcaru).
Andreas,
241

Cubra todos los casos. No confíe en que su entrada proviene de un entorno Windows.

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

o

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Alin Purcaru
fuente
21
Esto dará como resultado elementos de matriz vacíos si el eol es \r\n. Para evitar eso, tampoco el uso: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(nota que \r\nse hace innecesaria cuando se utiliza esa bandera) o simplemente poner el \r\n antes del \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave
2
@webbiedave PREG_SPLIT_NO_EMPTY es bueno, PERO eliminará las líneas vacías. Esto puede o no ser deseable.
jms
Este patrón coincidiría con cada letra para mí, porque resulta en éxito incluso si no hay nada presente. "?" significa 0 o una vez, por lo que es posible que coincida incluso si tanto \ r como \ n no están presentes. Dices "arreglado" pero no lo veo. Usé / (\ r | \ n) + / en su lugar.
Rolf
1
@Rolf Parece que hice una edición a toda prisa. Corregido ahora. Lo que debe usar depende de si desea las líneas vacías o no en la salida. La opción de mi respuesta también devuelve líneas vacías.
Alin Purcaru
3
@AlinPurcaru ¿Puede aclarar en la respuesta qué (ambos, ninguno, ninguno) devolverá espacios en blanco y cuáles no?
Patrick
150

Prueba "\n\r"(comillas dobles) o simplemente "\n".

Si no está seguro de qué tipo de EOL tiene, ejecute str_replace antes de su explosión, reemplazando "\ n \ r" con "\ n".

Seleccionar0r
fuente
52
Las comillas simples en PHP significan "no analizar esta cadena". Eso significa que sus caracteres de control no se están analizando, se están tomando como literales (no como un salto de línea y un retorno de carro, sino real, literal '\ n \ r'). El uso de comillas dobles significa "analizar esta cadena" y, por lo tanto, se analizarán los caracteres de control. +1
Ryan Kinal
17
/n/r? Sé que el OP escribió eso, pero el eol de Windows correcto es\r\n
webbiedave
20
Considere el PHP final de la línea constante: PHP_EOL.
Daniel W.
Hola a todos, esta es definitivamente la respuesta correcta. Me pregunto por qué la respuesta de @Alin Purcaru obtuvo 44 votos. ¡Está mal! No siempre funciona correctamente, aunque parece que hace el trabajo ... Así que aquí está mi comentario para cualquiera que se quede con lo mismo
Rafik Bari
3
Simplemente ignore el \ r, el último sistema operativo que lo usó sin \ n fue OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Por lo tanto, esto le dará los mejores resultados:explode("\n", str_replace("\r", '', $string));
DanielM
15

Muchas cosas aquí:

  • Debe usar comillas dobles, no comillas simples, de lo contrario los caracteres escapados no se escaparán.
  • La secuencia normal es \r\n, no \n\r.
  • Dependiendo de la fuente, es posible que te estés quedando \nsin el \r(o incluso en casos inusuales, posiblemente solo el \r)

Dado el último punto, puede encontrar que el preg_split()uso de todas las variantes posibles le dará una forma más confiable de dividir los datos que explode(). Pero, alternativamente, podría usar explode()con just \n, y luego usar trim()para eliminar los \rcaracteres que quedan.

Spudley
fuente
Gran respuesta. Sucinto, cubre todo. ¡Gracias!
Kosta Kontos
11

esta función php explota cadena por nueva línea

Atención : la nueva línea en Windows es \ r \ n y en Linux y Unix es \ n
esta función cambia todas las líneas nuevas al modo Linux y luego la divide.
preste atención a que las líneas vacías serán ignoradas

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}

ejemplo

$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

salida

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)
iman
fuente
10

tratar

explode(chr(10), $_POST['skuList']);
Oberdan
fuente
6

Para una nueva línea, es solo

$list = explode("\n", $text);

Para una nueva línea y retorno de carro (como en los archivos de Windows), es como lo publicó. ¿Es su skuList un área de texto?

Andrew Sledge
fuente
4

Coloque las \ncomillas dobles:

explode("\n", $_POST['skuList']);

Entre comillas simples, si no me equivoco, esto se trata como \y por nseparado.

Russell Dias
fuente
3

¿Has intentado usar comillas dobles?

piddl0r
fuente
3

No es perfecto, pero creo que debe ser más seguro. Añadir nl2br :

$skuList = explode('<br />', nl2br($_POST['skuList']));
nggit
fuente
1

Prueba esto:

explode(PHP_EOF, $lines);
usuario3762492
fuente
3
Seguramente PHP_EOL en lugar de EOF
Ewen
1

Tan fácil como parece

$skuList = explode('\\n', $_POST['skuList']);

Solo necesita pasar el texto exacto "\ n" y escribir \ n directamente se está utilizando como una secuencia de escape. Entonces "\\" para pasar una simple barra hacia atrás y luego poner "n"

Utsav Barnwal
fuente
0

En primer lugar, creo que generalmente \r\n, en segundo lugar, no son iguales en todos los sistemas. Eso solo funcionará en Windows. Es un poco molesto tratar de descubrir cómo reemplazar nuevas líneas porque los diferentes sistemas las tratan de manera diferente (ver aquí ). Puede que tengas mejor suerte con solo \n.

Richard Marskell - Drackir
fuente
0

Si alguien más intentó esto pero no funcionó, este es un recordatorio de que podría haber hecho el mismo pedo cerebral que yo.

¿Has escapado mysql de la cadena primero? En este caso, el carácter de nueva línea ya no es un carácter de nueva línea.

No hice nada para evitar analizarlo, solo lo adapté y exploté con '\ n' (literalmente barra invertida yn en lugar del carácter real de nueva línea.

usuario37150
fuente
3
hacer cualquier manipulación de cadenas después de escapar de mysql no tiene absolutamente ningún sentido
Your Common Sense
0

¿Saltos de línea perdidos por publicar desde cuadros de texto de entrada?
Lo que funciona más rápido para mí es copiar y pegar cualquier texto o tipo de tabla de Excel o HTML o tipo de datos de nueva línea y pegarlo en un área de texto en lugar de un cuadro de texto de entrada: esto mantiene intactos los saltos de línea en la POST.

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

en el formulario que recibe el archivo:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];
KarlosFontana
fuente
0

Este método siempre funciona para mí:

$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));

fuente
0

PHP_EOL se usa aparentemente para encontrar el carácter de nueva línea de una manera compatible con plataformas cruzadas, por lo que maneja problemas de DOS / Unix.

Prueba esto:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);
Radosav Leovac
fuente
0

Puedes probarlo con regex:

$skuList = explode('/[\r\n]+/', $_POST['skuList']);

Tarol
fuente
0

Esto es lo que funcionó para mí. Probado en PHP 5.6 y PHP 7.0:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
codemonkey
fuente