Simples, certo? Bem, isso não está funcionando: - \
$skuList = explode('\n\r', $_POST['skuList']);
\r\n
não são o contrário.
Simples, certo? Bem, isso não está funcionando: - \
$skuList = explode('\n\r', $_POST['skuList']);
\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 .
$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']);
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']);
\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".
/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 que explode()
. Mas, como alternativa, você pode usar explode()
just \n
, e depois trim()
remover todos os \r
caracteres restantes.
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
)
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?
Coloque as \n
aspas duplas:
explode("\n", $_POST['skuList']);
Entre aspas simples, se não me engano, isso é tratado como \
e n
separadamente.
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"
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
.
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.
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];
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'])));
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);
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);