Como posso colocar strings em uma matriz, dividida por nova linha?


220

Eu tenho uma string com quebras de linha no meu banco de dados. Quero converter essa string em uma matriz e, para cada nova linha, pular um lugar de índice na matriz.

Se a sequência for:

My text1
My text2
My text3

O resultado que eu quero é este:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

1
Eu não sei PHP, mas geralmente existe uma função chamada "split" para strings. Funciona assim: array = split (string, "\ n")
Sedat Kapanoglu

Você deve normalizar as novas linhas primeiro, provavelmente. O método s($yourString)->normalizeLineEndings()está disponível no github.com/delight-im/PHP-Str (biblioteca sob licença MIT), que possui muitos outros auxiliares de seqüência de caracteres úteis. Você pode dar uma olhada no código fonte.
caw

Respostas:


290

Você pode usar a explodefunção, usando " \n" como separador:

$your_array = explode("\n", $your_string_from_db);

Por exemplo, se você possui este pedaço de código:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Você obteria esta saída:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


Observe que você precisa usar uma cadeia de caracteres entre aspas duplas , portanto, \nna verdade , é interpretada como uma quebra de linha.
(Consulte a página do manual para obter mais detalhes.)


52
Em vez de \nvocê pode usar a constante predefinida PHP_EOL.
21712 Tim Tim

40
Todos tenham cuidado com esta solução, pois ela não funciona em todas as novas linhas. Eu tive o maior sucesso com a resposta de David
Maurice

1
Você deve dividir em \ n ou \ r para poder lidar com todo tipo de texto - isso funcionará apenas com as novas linhas do linux e do windows. As novas linhas do Mac serão desconsideradas! (\ r)
Steve Horvath

1
Eu acho que a resposta / comentário do Tims não está certo, porque isso corresponderá apenas à quebra de linha do SEU sistema, mas quando você obtém strings que possuem quebras de linha de outros sistemas, não funcionará! Teve este problema com e
Asara 30/11

7
Nope esta resposta e os comentários sobre esta resposta estão errados! Porque isso não leva em consideração o caractere de nova linha do SO, especialmente não PHP_EOL. Você deve usar preg_split("/\\r\\n|\\r|\\n/", $value).
precisa saber é o seguinte

330

Eu sempre usei isso com grande sucesso:

$array = preg_split("/\r\n|\n|\r/", $string);

(atualizado com o final \ r, obrigado @LobsterMan)


11
Esta resposta deve estar no topo em vez da de Pascal. Esse não funcionou em todos os casos.!
precisa saber é o seguinte

1
Essa é a resposta. O validado está errado. Bem, o hesselbom também tem ... Você também pode usar este equivalente: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); por uma questão de beleza :) Por que essa é a única boa resposta? Como você não pode assumir que tipo de final de linha você receberá: Mac (\ r), Windows (\ r \ n) ou Unix (\ n).
Ninj

2
\R partidas \n , \re\r\n
mpen 13/10

1
Ou menor/\r?\n/
Jason Schilling

Este exemplo está correto porque você não pode simplesmente executar qualquer operação de divisão baseada apenas em um único caractere. Se você fizer isso, ativando '\ r' ou '\ n', você terminará com uma linha vazia supérflua no caso de um \ "\ r \ n" final do Windows. E é importante que o separador do Windows de dois caracteres seja testado primeiro.
AndresRohrAtlasInformatik

281

Uma quebra de linha é definida de maneira diferente em plataformas diferentes, \ r \ n, \ r ou \ n.

Usando RegExp para dividir a sequência, você pode combinar todas as três com \ R

Então, para o seu problema:

$array = preg_split ('/$\R?^/m', $string);

Isso corresponderia a quebras de linha no Windows, Mac e Linux!


3
Eu usei isso também em vez da resposta aceita e de quaisquer outras respostas neste tópico. Apenas deixando este comentário como um informativo.
Seth Malaki

3
Na verdade, isso não funcionou para mim. Às vezes, novas linhas ainda estão presentes nas chaves da matriz.
Maurice


32
É só usar #$array = preg_split ('/\R/', $string);
Jan Goyvaerts 15/02

18
Às vezes não funciona! preg_split("/\r\n|\n|\r/", $string)melhor escolha
Alexey B.

34

O PHP já conhece o (s) caractere (s) de nova linha do sistema atual. Basta usar a constante EOL.

explode(PHP_EOL,$string)

18
Sim, mas é possível editar um arquivo ou, como neste exemplo, uma entrada db no Windows e usá-lo em um sistema Linux, por exemplo. Eu acho que uma abordagem geral se adequaria melhor.
Cranio

Não tenho certeza se isso está certo. Se uma área de texto em uma página da Web for enviada, ela poderá ter diferentes caracteres de final de linha, dependendo do navegador do usuário, não do sistema operacional do servidor. Portanto, não importa qual sistema operacional você esteja usando, será necessário analisar qualquer coisa. Isso pressupõe que você esteja fazendo coisas na Web, é claro.
Magmatic

Talvez você precise usar trim()as seqüências de caracteres resultantes para remover qualquer espaço em branco externo.
Tim

30

Uma alternativa à resposta de Davids, que é mais rápida (muito mais rápida) é usar str_replacee explode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

O que está acontecendo é:
como as quebras de linha podem ter diferentes formas, eu str_replace\ r \ n, \ n \ re \ com + n (e o \ n original são preservados).
Em seguida, exploda \ne você terá todas as linhas em uma matriz.

Eu fiz uma referência no src desta página e dividi as linhas 1000 vezes em um loop for e:
preg_replacedemorei uma média de 11 segundos
str_replace & explode levou uma média de cerca de 1 segundo

Mais detalhes e informações sobre bencmark no meu fórum


O link do seu fórum (e todo o domínio) parece estar inativo #
Nikita #

19

David: Ótima direção, mas você perdeu. isso funcionou para mim:

$array = preg_split("/(\r\n|\n|\r)/", $string);

11

Você não precisa de funções preg_ * nem padrões de preg, nem str_replace dentro, etc .. para poder com sucesso quebrar uma string em array por novas linhas. Em todos os cenários, seja Linux / Mac ou m $, isso funcionará.

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL é uma constante contendo os caracteres de quebra de linha usados ​​pela plataforma do servidor.


3
o arquivo poderia vir de outro sistema com diferentes linhas novas, particularry em um ambiente líquido wich é PHP usado
Luca C.

Qual é exatamente o motivo pelo qual essa constante existe .. e lida com esse problema específico.
Spooky

se você pegar um arquivo do windows, ele não corresponde ao mesmo arquivo do unix ou mac, certo?
Luca C.

Se você estiver usando utf-8 puro o tempo todo, em todos os lugares, arquivos utf8 incluídos, normalmente, e você não tiver mais nada além do PHP_EOL no código Yours para detecções de quebra de linha, ele corresponderá conforme descrito e nenhum comportamento imprevisível ocorrerá. Tenha em mente que não sou só eu gritando e reivindicando isso. A usabilidade do PHP_EOL é bastante confirmada.
Spooky

1
No seu caso, se as fontes vierem de algum outro lugar e não estiverem bem formadas, seja o que for, talvez seja melhor usar o str_replace (mais rápido que o regexp). ... apesar de tudo, seja regexp. ou str_replace ou PHP_EOL, há uma boa frase antiga dizendo: "Se funcionar - não toque nela!". :)
Spooky

9
explode("\n", $str);

O "(em vez de ') é bastante importante, caso contrário, a quebra de linha não será interpretada.


9

StackOverflow não permitirá que eu comente a resposta de hesselbom (reputação insuficiente), por isso estou adicionando a minha ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

Isso funcionou melhor para mim porque também elimina os espaços em branco à esquerda (segundo \ s *) e à direita (primeiro \ s *) automaticamente e também ignora as linhas em branco (o sinalizador PREG_SPLIT_NO_EMPTY).

- = OPÇÕES = -

Se você deseja manter o espaço em branco à esquerda, basta se livrar do segundo \ s * e transformá-lo em um rtrim () ...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

Se você precisar manter linhas vazias, livre-se do sinalizador NULL (é apenas um espaço reservado) e PREG_SPLIT_NO_EMPTY, assim ...

$array = preg_split('/\s*\R\s*/', trim($text));

Ou mantendo os espaços em branco à esquerda e as linhas vazias ...

$array = preg_split('/\s*\R/', rtrim($text));

Não vejo nenhuma razão para que você queira continuar em branco, então sugiro deixar o primeiro \ s * lá. Mas, se tudo o que você deseja é dividir por nova linha (como o título sugere), é ESTE simples (como mencionado por Jan Goyvaerts) ...

$array = preg_split('/\R/', $text);

O mmodificador não é realmente necessário, é? Isso não afeta apenas ^e $?
MPEN

@ mpen Sim, acredito que você esteja correto. Eu apenas carreguei junto com a versão do hesselbom. Vou editar minha postagem.
Deen Foxx

7
<anti-answer>

Como outras respostas especificaram, certifique-se de usar, explodee não splitporque o PHP 5.3.0 splitestá obsoleto. ou seja, o seguinte NÃO é o que você deseja fazer:

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr (10), CR = "\ r" = chr (13)

</anti-answer>

3

Para quem tenta exibir cronjobs em um crontab e fica frustrado com a forma de separar cada linha, use explodir:

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

usar '\ n' parece não funcionar, mas o chr (10) funciona bem: D

espero que isso poupe a alguém algumas dores de cabeça.


Oi Jeff, bem-vindo ao SO. Você deve reescrever isso como uma pergunta e resposta, em vez de uma resposta na pergunta de outra pessoa. Este é um site de perguntas e respostas, não um fórum geral. Dê uma olhada no FAQ - stackoverflow.com/faq
Rebecca Scott

Usando '\n'não funciona porque seqüências de escape não são interpretados entre aspas simples, você precisa usar aspas duplas em vez disso: "\n"em vez de 'n'Ler php.net/manual/en/language.types.string.php
Christopher K.


2

Você pode fazer um $ string = nl2br ($ string) para que sua quebra de linha seja alterada para

<br />. 

Dessa forma, não importa se o sistema usa \ r \ n ou \ n ou \ r

Então você pode alimentá-lo em uma matriz:

$array = explode("<br />", $string);

Nota: o nl2br não substitui as quebras de linha ... ele insere apenas uma marca de quebra antes de cada quebra de linha. Portanto, todos os itens da matriz, exceto o primeiro, começarão com uma quebra de linha. Se isso não importa para você, esse método é o mais rápido. Se isso importa, a resposta de Jakar é a mais rápida.
Aust

2

Esse é meu caminho:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

Isso também ignorará todas as linhas vazias também.


1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

matriz verdadeira:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

Incorporar Online:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


Adicione um pouco de explicação com a resposta de como essa resposta ajuda OP na fixação edição atual
ρяσѕρєя K

1

Peguei isso nos documentos php:

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>

0

Este método sempre funciona para mim:

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

1
Ame os palavrões como parte do código. :) De qualquer forma, substituir por \ n é mais simples e mais seguro (veja as outras respostas).
Stefan Reich

0

Usar apenas o pacote 'base' também é uma solução para casos simples:

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

-6

Usando qualquer caractere especial entre a seqüência de caracteres ou quebra de linha \nusando o PHP explode, podemos conseguir isso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.