@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):
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.
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\nantes 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".
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.
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
)
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"
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.
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.
<textareaid="txtArea"name="txtArea"rows="40"cols="170"></textarea><br><inputtype="submit"value="split lines into array"/>
$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'])));
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);
\r\n
não são o contrário.Respostas:
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 .
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):
fonte
Cubra todos os casos. Não confie que sua entrada é proveniente de um ambiente Windows.
ou
fonte
\r\n
. Para evitar que, tanto para uso:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(note que\r\n
se 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']);
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".
fonte
/n/r
? Eu sei que o OP escreveu isso, mas o janelas eol correta é\r\n
PHP_EOL
.explode("\n", str_replace("\r", '', $string));
Muitas coisas aqui:
\r\n
, não\n\r
.\n
sem 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 queexplode()
. Mas, como alternativa, você pode usarexplode()
just\n
, e depoistrim()
remover todos os\r
caracteres restantes.fonte
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
exemplo
resultado
fonte
experimentar
fonte
Para uma nova linha, é apenas
Para uma nova linha e retorno de carro (como nos arquivos do Windows), é como você postou. O seu skuList é uma área de texto?
fonte
Coloque as
\n
aspas duplas:explode("\n", $_POST['skuList']);
Entre aspas simples, se não me engano, isso é tratado como
\
en
separadamente.fonte
Você já tentou usar aspas duplas?
fonte
Não é perfeito, mas acho que deve ser mais seguro. Adicione nl2br :
fonte
Tente o seguinte:
fonte
Tão fácil quanto parece
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"
fonte
Primeiro de tudo, acho que geralmente
\r\n
nã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
.fonte
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.
fonte
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.
no formulário que recebe o arquivo:
fonte
Este método sempre funciona para mim:
fonte
Tente o seguinte:
fonte
Você pode experimentá-lo com regex:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
fonte
Aqui está o que funcionou para mim. Testado no PHP 5.6 e no PHP 7.0:
fonte