Explodir string PHP por nova linha

253

Simples, certo? Bem, isso não está funcionando: - \

$skuList = explode('\n\r', $_POST['skuList']);
Webnet
fonte
28
Aspas simples significam "não analise essa sequência". A resposta do @ Select0r é provavelmente o que você está procurando.
precisa
3
possível duplicata de como remover novas linhas e retornos da string php? que já era uma duplicata de Remoção confiável de linhas de notícias da string e algumas outras . Use a função de pesquisa antes de fazer perguntas, por favor!
Gordon
1
@Gordon: Ah, eu vi o que o coronel Shrapnel disse nessa outra pergunta. Meio triste, na verdade. Adicionando meu voto apertado.
BoltClock
9
Além das aspas simples emitidas mencionadas por outros, os pares CRLF \r\nnão são o contrário.
Powerlord 22/10/10
1
Tente lembrar que: \ R etur \ N
l00k 26/03/19

Respostas:

410

Melhor prática

Conforme mencionado no comentário da primeira resposta, a melhor prática é usar a constante PHP_EOL do PHP, que representa a EOL ( End Of Line ) do sistema atual .

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

O PHP fornece muitas outras constantes muito úteis que você pode usar para tornar seu sistema de código independente; consulte este link para encontrar constantes de diretório úteis e independentes do sistema.

Aviso

Essas constantes tornam seu sistema de páginas independente, mas você pode ter problemas ao passar de um sistema para outro ao usar as constantes com dados armazenados em outro sistema. As constantes do novo sistema podem ser diferentes das do sistema anterior e os dados armazenados podem não funcionar mais. Analise completamente seus dados antes de armazená-los para remover quaisquer partes dependentes do sistema.

ATUALIZAR

O comentário de Andreas me fez perceber que a solução 'Best Practice' que apresento aqui não se aplica ao caso de uso descrito: o EOL (PHP) do servidor não tem nada a ver com o EOL que o navegador (qualquer SO) está usando, mas é aí (o navegador) que a origem da string.

Então, por favor, use a solução de @Alin_Purcaru ( três a menos ) para cobrir todas as suas bases (e votar novamente a resposta dele):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Larzan
fonte
5
Esta é uma resposta nova, mas é provavelmente o melhor e com razão, a resposta aceita
frazras
Isso é estranho, pois é o modo como o PHP quer que você faça isso :) Você pode me dar mais detalhes sobre sua versão do SO e do PHP, talvez um pedaço de código no PasteBin ou sth. semelhante?
Larzan 7/09/15
16
Você não pode usar o PHP_EOL porque o sistema e a fonte de entrada não têm nada a ver um com o outro. Se o usuário colocar novas linhas no Windows e o PHP estiver em execução no Linux, o resultado poderá ser interrompido.
Barell
1
@ barell exatamente, essa é a situação que descrevo na parte 'warning';) A questão não declarou explicitamente que se trata de uma entrada antiga armazenada no banco de dados. Por favor, leia a parte 'aviso' e você verá que eu abordo essa situação lá.
Larzan
7
Esta resposta está errada para este caso de uso. Não use a constante PHP_EOL nesse caso, pois a fonte de entrada (por exemplo, o navegador do usuário) definitivamente não é o seu sistema. Use uma solução que cuide de todas as diferentes terminações de linha (resposta de Alin Purcaru).
Andreas
241

Cubra todos os casos. Não confie que sua entrada é proveniente de um ambiente Windows.

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

ou

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
Alin Purcaru
fonte
21
Isso resultará em elementos vazios da matriz se o eol for \r\n. Para evitar que, tanto para uso: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(note que \r\nse torna desnecessário ao usar essa bandeira) ou simplesmente colocar o \r\n antes de o \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave
2
@webbiedave PREG_SPLIT_NO_EMPTY é legal, mas excluirá as linhas vazias. Isso pode ou não ser desejável.
JMS
Esse padrão corresponderia a todas as letras para mim, porque resulta em sucesso, mesmo que nada esteja presente. "?" significa 0 ou uma vez, portanto, é possível corresponder mesmo se \ r e \ n não estiverem presentes. Você diz "consertado", mas eu não vejo isso. Eu usei / (\ r | \ n) + /.
Rolf
1
@Rolf Parece que eu fiz uma edição com pressa. Corrigido agora. O que você deve usar depende se você deseja as linhas vazias ou não na saída. A opção da minha resposta também retorna linhas vazias.
Alin Purcaru
3
@AlinPurcaru Você pode esclarecer na resposta quais (os dois também não?) Retornarão espaços em branco e quais não retornarão?
Patrick Patrick
150

Tente "\n\r"(aspas duplas) ou apenas "\n".

Se você não tiver certeza de qual tipo de EOL possui, execute um str_replace antes de explodir, substituindo "\ n \ r" por "\ n".

Select0r
fonte
52
Aspas simples no PHP significam "não analise essa string". Isso significa que seus caracteres de controle não estão sendo analisados, estão sendo interpretados como literais (não uma quebra de linha e um retorno de carro, mas reais, \ n \ r 'literal). Usar aspas duplas significa "analisar esta string" e, portanto, seus caracteres de controle serão analisados. 1
Ryan Kinal
17
/n/r? Eu sei que o OP escreveu isso, mas o janelas eol correta é\r\n
webbiedave
20
Considere o PHP fim de linha constante: PHP_EOL.
Daniel W.
Olá pessoal, esta é definitivamente a resposta certa! Estou me perguntando por que a resposta de @Alin Purcaru obteve 44 votos .. Está errado !!! Nem sempre está funcionando corretamente, embora pareça que ele faz o trabalho .. Então, aqui está o meu comentário para quem está preso na mesma coisa #
Rafik Bari
3
Apenas desconsidere o \ r, o último sistema operacional a usá-lo sem \ n foi o OS9 ( pt.wikipedia.org/wiki/Newline#Representations ). Portanto, isso lhe dará os melhores resultados:explode("\n", str_replace("\r", '', $string));
DanielM 15/15/15
15

Muitas coisas aqui:

  • Você precisa usar aspas duplas, não aspas simples, caso contrário, os caracteres escapados não serão escapados.
  • A sequência normal é \r\n, não \n\r.
  • Dependendo da fonte, você pode simplesmente estar ficando \nsem o \r(ou mesmo em casos incomuns, possivelmente apenas o \r)

Dado o último ponto, você pode achar que preg_split()usar todas as variantes possíveis fornecerá uma maneira mais confiável de dividir os dados do que explode(). Mas, como alternativa, você pode usar explode()just \n, e depois trim()remover todos os \rcaracteres restantes.

Spudley
fonte
Ótima resposta. Sucinto, cobre tudo. Obrigado!
Kosta Kontos 14/02
11

esta função php explode string por nova linha

Atenção : a nova linha no Windows é \ r \ n e no Linux e Unix é \ n
essa função altera todas as novas linhas para o modo linux e depois a divide.
preste atenção que as linhas vazias serão ignoradas

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

exemplo

$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) );

resultado

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

experimentar

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

Para uma nova linha, é apenas

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

Para uma nova linha e retorno de carro (como nos arquivos do Windows), é como você postou. O seu skuList é uma área de texto?

Andrew Sledge
fonte
4

Coloque as \naspas duplas:

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

Entre aspas simples, se não me engano, isso é tratado como \e nseparadamente.

Russell Dias
fonte
3

Você já tentou usar aspas duplas?

piddl0r
fonte
3

Não é perfeito, mas acho que deve ser mais seguro. Adicione nl2br :

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

Tente o seguinte:

explode(PHP_EOF, $lines);
user3762492
fonte
3
Certamente PHP_EOL em vez de EOF
Ewen
1

Tão fácil quanto parece

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

Você só precisa passar o texto exato "\ n" e escrever \ n diretamente está sendo usado como uma sequência de escape. Então "\\" passe uma barra invertida simples e coloque "n"

Utsav Barnwal
fonte
0

Primeiro de tudo, acho que geralmente \r\nnão é o mesmo em todos os sistemas. Isso funcionará apenas no Windows. É meio chato tentar descobrir como substituir novas linhas porque sistemas diferentes as tratam de maneira diferente (veja aqui ). Você pode ter melhor sorte com apenas \n.

Richard Marskell - Drackir
fonte
0

Se alguém tentou isso, mas não estava funcionando, é um lembrete de que você pode ter feito o mesmo peido do cérebro que eu.

Você mysql escapou da string primeiro? Nesse caso, o caractere de nova linha não é mais um caractere de nova linha.

Eu não fiz nada para evitar a análise, apenas me adaptei e explodi com '\ n' (literalmente barra invertida e n em vez do caractere de nova linha real.

user37150
fonte
3
fazer qualquer manipulação de string após o escape do mysql não faz absolutamente nenhum sentido
Your Common Sense
0

Perder quebras de linha ao postar nas caixas de texto de entrada?
O que funciona mais rápido para mim é copiar e colar qualquer texto ou tipo de tabela do Excel ou HTML ou tipo de nova linha de dados e colá-lo em uma área de texto em vez de em uma caixa de entrada de texto: isso mantém as quebras de linha intactas no POST.

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

no formulário que recebe o arquivo:

 $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
fonte
0

Este método sempre funciona para mim:

$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'])));

fonte
0

PHP_EOL é ostensivamente usado para encontrar o caractere de nova linha de uma maneira compatível com várias plataformas, para lidar com problemas de DOS / Unix.

Tente o seguinte:

$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
fonte
0

Você pode experimentá-lo com regex:

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

Tarol
fonte
0

Aqui está o que funcionou para mim. Testado no PHP 5.6 e no 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
fonte