Pergunta

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

Se a string é:

Meu text1
Meu text2
Meu text3

O resultado que eu quero é o seguinte:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Foi útil?

Solução

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

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

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

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

Você deseja obter esta saída:

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


Note que você tem que usar um duplo citou corda , então \n é realmente interpretado como uma linha-break.
(veja a página manual para mais detalhes)

Outras dicas

Eu sempre usei isso com grande sucesso:

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

(atualizado com a final \ r, graças @LobsterMan)

Uma quebra de linha é definido de forma diferente em diferentes plataformas, \ r \ n, \ r ou \ n.

Usando RegExp para dividir a seqüência que você pode combinar todos os três com \ R

Assim, para o seu problema:

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

Isso iria coincidir com quebras de linha em Windows, Mac e Linux!

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

explode(PHP_EOL,$string)

Uma alternativa para Davids resposta que é mais rápido (forma mais rápida) é a utilização str_replace e explode.

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

O que está acontecendo é:
Desde quebras de linha pode vir em diferentes formas, eu str_replace \ r \ n \ n \ r e \ r com \ n vez (e original \ n são preservados).
Em seguida, explodir em \n e você tem todas as linhas em uma matriz.

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

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

David: Grande direção, mas você perdeu o \ r. Isso funcionou para mim:

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

A "(em vez de ') é muito importante, caso contrário, a quebra de linha wouln't se interpretado.

Você não precisa preg_ * funções nem padrões preg nem str_replace dentro, etc .., a fim de sucessfuly quebrar uma string em conjunto por novas linhas. Em todos os cenários, seja Linux / Mac ou m $, isso vai fazer.

<?php 

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

?>

PHP_EOL é uma constante segurando o personagem quebra de linha (s) utilizado pela plataforma de servidor.

StackOverflow não vai permitir-me a comentar sobre a resposta de hesselbom (reputação não o suficiente), então eu estou adicionando meu próprio ...

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

Isso funcionou melhor para mim, porque ele também elimina líder (segunda \ s *) e à direita (primeira \ s *) espaços em branco automaticamente e também ignora linhas em branco (a bandeira PREG_SPLIT_NO_EMPTY).

- = OPÇÕES = -

Se você quiser manter os espaços em branco, simplesmente se livrar da segunda \ s * e torná-lo um rtrim () em vez ...

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

Se você precisa manter linhas vazias, se livrar do NULL (que é apenas um espaço reservado) e bandeira PREG_SPLIT_NO_EMPTY, como assim ...

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

Ou mantendo ambos os espaços em branco e vazio linhas principais ...

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

Eu não vejo nenhuma razão pela qual você alguma vez quiser manter espaços em branco, então eu sugiro deixando o primeiro \ s * lá. Mas, se tudo que você quer é dividida pela nova linha (como o título sugere), é este simples (como mencionado por Jan Goyvaerts) ...

$array = preg_split('/\R/', $text);
<anti-answer>

Como outras respostas especificou, certifique-se de explode uso ao invés de split porque a partir do PHP 5.3.0 split está obsoleta. ou seja, o seguinte é não do jeito que você quiser fazê-lo:

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

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

</anti-answer>

Para qualquer um que tenta cronjobs exibição em um crontab e ficando frustrados sobre como separar cada linha, o uso explodir:

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

usando '\ n' não parece trabalho, mas chr (10) funciona muito bem: D

espero que isso economiza cerca de um algumas dores de cabeça.

Você pode usar o seguinte:

 \str_getcsv($str,PHP_EOL);

Você pode fazer uma $ string = nl2br ($ string) para que sua quebra de linha é alterado para

<br />. 

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

Em seguida, você pode alimentá-lo em uma matriz:

$array = explode("<br />", $string);
$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";
}

true array:

$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

Embed on-line:

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

Colhidos este se nos docs 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);
?>

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

Usando 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)

Essa é a minha maneira:

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

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

O uso de qualquer caractere especial entre a corda ou linha de quebra \n usando PHP explode podemos alcançar este objectivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top