Come posso mettere le stringhe in un array, divise per una nuova linea?


220

Ho una stringa con interruzioni di riga nel mio database. Voglio convertire quella stringa in un array e, per ogni nuova riga, saltare un posto indice nell'array.

Se la stringa è:

My text1
My text2
My text3

Il risultato che voglio è questo:

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

1
Non conosco PHP ma di solito esiste una funzione chiamata "split" per le stringhe. Funziona così: array = split (stringa, "\ n")
Sedat Kapanoglu,

Dovresti normalizzare prima le nuove righe, probabilmente. Il metodo s($yourString)->normalizeLineEndings()è disponibile con github.com/delight-im/PHP-Str (libreria con licenza MIT) che ha molti altri utili aiutanti di stringa. Potresti dare un'occhiata al codice sorgente.
Caw

Risposte:


290

Puoi usare la explodefunzione, usando " \n" come separatore:

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

Ad esempio, se hai questo codice:

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

Otterresti questo risultato:

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


Nota che devi usare una stringa tra virgolette doppie , quindi \nviene effettivamente interpretata come un'interruzione di riga.
(Vedi quella pagina di manuale per maggiori dettagli.)


52
Invece di \nte puoi usare la costante predefinita PHP_EOL.
Tim

40
Tutti, per favore, state attenti con questa soluzione, poiché non funziona su tutte le nuove linee. Ho avuto il maggior successo con la risposta di David
Maurice,

1
Devi essere diviso in \ no \ r per essere in grado di gestire tutti i tipi di testi - questo funzionerà solo con le nuove righe di Linux e Windows. Le newline per Mac saranno ignorate! (\ r)
Steve Horvath,

1
Immagino che la risposta / commento di Tims non sia corretta, perché corrisponderà solo all'interruzione di linea di un sistema TUO, ma quando si ottengono stringhe con interruzioni di linea da altri sistemi, non funzionerà! Ha avuto questo problema con le e
Asara,

7
No, questa risposta e i commenti su questa risposta sono SBAGLIATI! Perché questo non tiene conto del carattere di nuova riga del sistema operativo, soprattutto no PHP_EOL. È necessario utilizzare preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84,

330

L'ho sempre usato con grande successo:

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

(aggiornato con il finale, grazie a @LobsterMan)


11
Questa risposta dovrebbe essere in cima invece di quella di Pascal. Quello non ha funzionato su tutti i casi.!
Jithesh Kt,

1
Questa è la risposta Quello convalidato è SBAGLIATO. Bene, anche hesselbom ce l'ha ... Potresti anche usare questo equivalente: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); per amore della bellezza :) Perché questa è l'unica buona risposta? Perché non puoi assumere quale tipo di fine riga otterrai: Mac (\ r), Windows (\ r \ n) o Unix (\ n).
Ninj

2
\R partite \n , \re\r\n
mpen

1
O più breve/\r?\n/
Jason Schilling il

Questo esempio è corretto perché non puoi semplicemente eseguire un'operazione di divisione basata solo su un singolo carattere. Se lo faresti, attivando '\ r' o '\ n' finirai con una riga vuota superflua in caso di una fine di Windows \ \ r \ n. Ed è importante testare prima il separatore di Windows a due caratteri.
AndresRohrAtlasInformatik,

281

Un'interruzione di linea viene definita in modo diverso su piattaforme diverse, \ r \ n, \ r o \ n.

Usando RegExp per dividere la stringa puoi abbinare tutti e tre con \ R

Quindi per il tuo problema:

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

Ciò corrisponderebbe alle interruzioni di riga su Windows, Mac e Linux!


3
Ho usato anche questo invece della risposta accettata e di qualsiasi altra risposta su questo thread. Sto solo lasciando questo commento come informativo.
Seth Malaki,

3
In realtà, questo non ha funzionato per me. A volte i newline erano ancora presenti nelle chiavi dell'array.
Maurice,


32
Basta usare$array = preg_split ('/\R/', $string);
Jan Goyvaerts il

18
A volte non funziona! preg_split("/\r\n|\n|\r/", $string)scelta migliore
Alexey B.

34

PHP conosce già i caratteri di nuova riga del sistema corrente. Basta usare la costante EOL.

explode(PHP_EOL,$string)

18
Sì, ma è possibile modificare un file o, come in questo esempio, una voce db in Windows, quindi utilizzarlo su un sistema Linux, ad esempio. Penso che un approccio generale si adatterebbe meglio.
Cranio,

Non sono sicuro che sia giusto. Se viene inviata un'area di testo in una pagina Web, potrebbe avere caratteri di fine riga diversi a seconda del browser dell'utente, non del sistema operativo del server. Quindi, indipendentemente dal sistema operativo in uso, dovrai essere in grado di analizzare qualsiasi cosa. Questo presume che tu stia facendo cose sul web ovviamente.
Magmatic

Potrebbe quindi essere necessario utilizzare trim()le stringhe risultanti per rimuovere qualsiasi spazio bianco estraneo.
Tim

30

Un'alternativa alla risposta di Davids che è più veloce (molto più veloce) è usare str_replacee explode.

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

Quello che sta succedendo è:
poiché le interruzioni di riga possono presentarsi in forme diverse, I str_replace\ r \ n, \ n \ r e \ r con \ n invece (e l'originale \ n vengono conservati).
Quindi esplodere \ne hai tutte le linee in un array.

Ho fatto un benchmark sull'SRC di questa pagina e ho diviso le linee 1000 volte in un ciclo for e: ho
preg_replacepreso una media di 11 secondi ho
str_replace & explodepreso una media di circa 1 secondo

Maggiori dettagli e informazioni sul segno distintivo sul mio forum


Il link al tuo forum (e l'intero dominio) sembra essere inattivo
Nikita 웃

19

David: Ottima direzione, ma ti sei perso. questo ha funzionato per me:

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

11

Non hai bisogno di funzioni preg_ * né di modelli preg né di str_replace all'interno, ecc. Per spezzare con successo una stringa nell'array con newline. In tutti gli scenari, che si tratti di Linux / Mac o m $, questo funzionerà.

<?php 

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

?>

PHP_EOL è una costante che contiene i caratteri di interruzione di riga utilizzati dalla piattaforma del server.


3
il file potrebbe provenire da un altro sistema con diverse nuove linee, particolarità in un ambiente di rete per il quale viene utilizzato PHP
Luca C.

Questo è esattamente il motivo per cui esiste questa costante ... e gestisce quel particolare problema.
Spettrale

se prendi un file da Windows non corrisponde allo stesso file di unix o mac, giusto?
Luca C.

Se stai usando puro utf-8 sempre e ovunque, file utf8 inclusi, normalmente, e non hai nient'altro che PHP_EOL nel tuo codice per i rilevamenti di interruzioni di linea, verrà abbinato come descritto e non si verificherà alcun comportamento non previsto. Tieni presente che non sono solo io a urlare e rivendicare questo. L'usabilità di PHP_EOL è abbastanza confermata.
Spettrale

1
Nel tuo caso, se le fonti provengono da qualche altra parte e non sono formate bene, comunque, è forse meglio se usi str_replace (più veloce di regexp). ... tutto sommato, sia esso regexp. o str_replace o PHP_EOL, c'è una buona vecchia frase che dice: "Se funziona, non toccarlo!". :)
Spooky,

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

Il "(invece di ') è piuttosto importante, altrimenti, l'interruzione di riga non viene interpretata.


9

StackOverflow non mi permetterà di commentare la risposta di hesselbom (non abbastanza reputazione), quindi sto aggiungendo il mio ...

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

Questo ha funzionato meglio per me perché elimina automaticamente anche gli spazi iniziali (second \ s *) e finali (first \ s *) e salta anche le righe vuote (il flag PREG_SPLIT_NO_EMPTY).

- = OPZIONI = -

Se vuoi mantenere uno spazio bianco in testa, devi semplicemente sbarazzarti del secondo \ s * e renderlo un rtrim () invece ...

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

Se devi mantenere le righe vuote, elimina il flag NULL (è solo un segnaposto) e PREG_SPLIT_NO_EMPTY, in questo modo ...

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

O mantenendo sia gli spazi bianchi principali sia le linee vuote ...

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

Non vedo alcun motivo per cui vorresti mai continuare a trascinare spazi bianchi, quindi suggerisco di lasciare il primo \ s * lì dentro. Ma, se tutto ciò che vuoi è dividere per nuova riga (come suggerisce il titolo), è QUESTO semplice (come menzionato da Jan Goyvaerts) ...

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

Il mmodificatore non è davvero necessario, vero? Questo non riguarda solo ^e $?
Aprire il

@mpen Sì, credo che tu abbia ragione. L'ho appena portato con la versione di hesselbom. Modificherò il mio post.
Deen Foxx,

7
<anti-answer>

Come hanno specificato altre risposte, assicurati di utilizzare explodepiuttosto che splitperché PHP 5.3.0 splitè obsoleto. cioè quanto segue NON è il modo in cui vuoi farlo:

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

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

</anti-answer>

3

Per chiunque cerchi di mostrare cronjobs in un crontab e frustrarsi su come separare ogni riga, usa esplodi:

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

usare '\ n' non sembra funzionare ma chr (10) funziona bene: D

spero che questo risparmi un po 'di mal di testa.


Ciao Jeff, benvenuto in SO. Dovresti riscriverlo come una domanda e una risposta, piuttosto che una risposta alla domanda di qualcun altro. Questo è un sito di domande e risposte, non un forum generale. Dai un'occhiata alle FAQ - stackoverflow.com/faq
Rebecca Scott,

L'uso '\n'non funziona perché le sequenze di escape non sono interpretate tra virgolette singole, devi invece usare le virgolette doppie: "\n"invece di 'n'Leggi php.net/manual/it/language.types.string.php
Christopher K.


2

È possibile eseguire $ string = nl2br ($ string) in modo che l'interruzione di riga venga modificata

<br />. 

In questo modo non importa se il sistema utilizza \ r \ n o \ n o \ r

Quindi puoi inserirlo in un array:

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

Nota: nl2br non sostituisce le interruzioni di riga ... inserisce solo un tag di interruzione prima di ogni interruzione di riga. Quindi tutti gli elementi dell'array diversi dal primo inizieranno con un'interruzione di riga. Se non ti interessa, questo metodo è il più veloce. Se questo è importante, la risposta di Jakar è la più veloce.
Agosto

2

Questo è il mio modo:

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

Anche questo salterà tutte le righe vuote.


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";
}

array vero:

$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

Incorpora online:

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


Aggiungi una spiegazione con la risposta su come questa risposta aiuta OP nel risolvere il problema attuale
ρяσѕρєя K

1

L'ho preso nei documenti 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

Questo metodo funziona sempre per me:

$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
Adoro il giuramento come parte del codice. :) Ad ogni modo, sostituire con \ n è più semplice e sicuro (guarda le altre risposte).
Stefan Reich,

0

L'uso del solo pacchetto 'base' è anche una soluzione per casi semplici:

> 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 qualsiasi carattere speciale tra la stringa o l'interruzione di linea \nusando l'esplosione di PHP possiamo raggiungere questo obiettivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.