PHP - come creare un personaggio newline?


405

In PHP sto cercando di creare un personaggio newline:

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo '\r\n';

Successivamente apro il file creato in Blocco note e scrive letteralmente la newline:

1 John Doe \ r \ n 1 John Doe \ r \ n 1 John Doe \ r \ n

Ho provato molte varianti di \r\n, ma nessuna funziona. Perché la nuova riga non si trasforma in una nuova riga?


Risposte:


639

Solo le stringhe tra virgolette doppie interpretano le sequenze di escape \re rispettivamente \n'0x0D' e '0x0A', quindi vuoi:

"\r\n"

Le stringhe a virgoletta singola , d'altra parte, conoscono solo le sequenze di escape \\e \'.

Quindi, a meno che non concateniate la singola stringa tra virgolette con un'interruzione di riga generata altrove (ad esempio, usando una stringa tra virgolette doppie "\r\n"o usando la chrfunzione chr(0x0D).chr(0x0A) ), l'unico altro modo per avere un'interruzione di riga all'interno di una singola stringa tra virgolette è letteralmente digitarlo con il vostro editor:

$s = 'some text before the line break
some text after';

Assicurati di controllare il tuo editor per le sue impostazioni di interruzione di riga se hai bisogno di una sequenza di caratteri specifica ( \r\nad esempio).


1
@Pacerier L'unico modo per avere caratteri di ritorno a capo e nuovi caratteri di riga in una singola stringa tra virgolette è inserire i caratteri direttamente tramite la tastiera (premere Invio, a seconda delle impostazioni dell'editor sui finali di riga). Altrimenti usa solo la concatenazione di stringhe.
Gumbo,

1
@Gumbo: Stai dicendo che le stringhe tra virgolette singole, d'altra parte, conoscono solo le sequenze di escape \\ e \ '. Ma ho appena stampato una riga con echo come <? Php echo 'Stai usando Internet Explorer. <br>'; echo 'Nuova riga aggiunta'; ?> e visto l'output nel browser. Ha letteralmente aggiunto una nuova linea tra due stringhe che ho visualizzato. Significa che il carattere <br> o <br/> viene espanso in una singola stringa tra virgolette. Esistono altri caratteri HTML diversi da questi tre che possono essere compresi da PHP all'interno delle singole stringhe tra virgolette? Vi chiedo cortesemente di aggiornare di conseguenza la vostra risposta. Grazie.
PHPFan

1
@ user2839497 Quello che stai dicendo non ha alcun senso. Non c'è contesto del browser qui. E ovviamente il browser visualizza una nuova riga quando si incontra un <br/>. E ovviamente non c'è nulla che ti impedisca di aggiungere '<br/>' in una singola stringa tra virgolette. Ma ciò non rende una nuova riga in un semplice file di testo.
Schermitore

1
@Pacerier Per una politica di virgolette singole invece di spezzare la linea nell'editor come suggerito da Gumbo nel suo commento, potresti usare l'altra soluzione nella risposta di Gumbos, ad esempio: 'emettere una nuova riga'.chr (0x0A).' In una singola stringa tra virgolette '.
Schermitore

2
Dovresti PHP_EOLinvece usare
kurdtpage il

234

Usa la PHP_EOLcostante predefinita :

echo $clientid, ' ', $lastname, PHP_EOL;

Il valore costante verrà impostato in base alle terminazioni di linea del sistema operativo in cui è in esecuzione PHP. Su Linux, lo sarà "\n"; su Windows, lo sarà "\r\n".


97

Il comando "echo" in PHP invia l'output al browser come HTML non elaborato, quindi anche se tra virgolette doppie il browser non lo analizzerà in due righe perché un carattere di nuova riga in HTML non significa nulla. Ecco perché è necessario utilizzare:

echo [output text]."<br>";

quando si utilizza "echo", oppure utilizzare fwrite ...

fwrite([output text]."\n");

Questo produrrà HTML newline al posto di "\ n".


4
Con il modo in cui viene posta la domanda, è probabile che stia emettendo questi dati in una casella di testo o javascript, ecc. Per l'analisi o la lettura di testo normale che non deve essere visualizzata come HTML
PC3TJ


23

Le stringhe tra virgolette doppie si ""interpolano, nel senso che convertono i caratteri di escape in caratteri stampabili.

Le stringhe tra virgolette singole ''sono letterali, nel senso che vengono trattate esattamente come i caratteri vengono digitati.

Puoi avere entrambi sulla stessa linea:

echo '$clientid $lastname ' . "\r\n";
echo "$clientid $lastname \r\n";

uscite:

$clientid $lastname
1 John Doe

La tua spiegazione sui diversi tipi di notazioni di stringa in PHP va bene in quanto mostra l'errore fatto dall'autore della domanda. Ma il tuo esempio di codice non produrrà il risultato atteso poiché le variabili vengono utilizzate in una singola stringa tra virgolette e, come hai detto, non verranno interpolate!
Damien Flament,

@Damien Flament, è quello che ho detto - i contenuti tra virgolette singole non sono interpolati, ma i contenuti tra virgolette doppie lo sono. Forse il mio esempio è confuso perché ti aspetti di vedere i contenuti di $ clientid e $ lastname, piuttosto che i letterali "$ clientid" e "$ lastname". Penso che questo fosse il titolo di una tabella che ho usato durante il debug. le seguenti righe sarebbero stateecho "$clientid $lastname\r\n"
Kevin S. Miller l'

Quando scrivo "il risultato atteso", sto parlando del risultato che l'autore della domanda si aspettava nella sua domanda. L'aggiunta del codice mostrato nel commento alla risposta e la visualizzazione del risultato potrebbero migliorare la qualità della risposta.
Damien Flament,


13

In realtà \r\nè per il lato HTML dell'output. Con questi caratteri puoi semplicemente creare una nuova riga nel codice html per renderlo più leggibile:

echo "<html>First line \r\n Second line</html>";

produrrà:

<html>First line
Second line</html>

che la visualizzazione della pagina sarà:

First line Second line

Se intendevi davvero questo, devi solo correggere la singola citazione con la "" citazione:

echo "\r\n";

Altrimenti se intendi dividere il testo, nel nostro esempio 'Prima riga' e 'Seconda riga' devi usare il codice html <br />::

First line<br />Second line

che produrrà:

First line
Second line

Inoltre sarebbe più leggibile se si sostituisse l'intero script con:

echo "$clientid $lastname \r\n";

1
No, non dovrebbe. Perché è principalmente sbagliato. Il primo blocco di codice verrà visualizzato come First line Second line: qualsiasi spazio bianco, compresi i newline, verrà compresso in un carattere di spazio nell'output di rendering. Inoltre, </br>è tutt'altro che HTML valido.
D_4_ni,

1
Inoltre, tieni presente che se invii e-mail di testo con il tuo script php, avrai comunque bisogno di quelle terminazioni di riga anziché delle interruzioni (<br>)
KennyV

9

w3school si è offerto in questo modo:

echo nl2br("One line.\n Another line.");

usando questa funzione puoi farlo..ho provato altri modi che ho detto sopra ma non mi aiuteranno ..


La domanda non riguarda l'interruzione di una riga all'interno di un paragrafo in HTML. Riguarda il personaggio newline !
Damien Flament,

Per il contesto, la nl2br()funzione converte i caratteri di nuova riga nel <br />tag HTML. Ciò potrebbe essere utile per creare una nuova riga nelle pagine del browser, ma non una nuova riga nei file di testo o JavaScript o per la stampa sullo schermo o sulla console.
SherylHohman,

4

Per qualche motivo, ogni singolo post che chiede scappamenti di newline in PHP non menziona il caso in cui il semplice inserimento di una nuova riga in stringhe a virgoletta singola farà esattamente quello che pensi:

ex 1.

 echo 'foo\nbar';

L'esempio 1 chiaramente non stampa il risultato desiderato, tuttavia, mentre è vero che non puoi sfuggire a una nuova riga tra virgolette singole, puoi averne uno:

ex 2.

 echo 'foo
 bar';

L'esempio 2 ha esattamente il comportamento desiderato. Sfortunatamente la newline che viene inserita dipende dal sistema operativo. Questo di solito non è un problema, poiché i browser / server Web interpretano correttamente la nuova riga se si tratta di \ r, \ r \ n o \ n.

Ovviamente questa soluzione non è l'ideale se si prevede di distribuire il file attraverso altri mezzi, quindi un browser Web e su più sistemi operativi. In tal caso dovresti vedere una delle altre risposte.

nota: usando un editor di testo ricco di funzionalità dovresti essere in grado di inserire una nuova riga come carattere / i binario che rappresenta una nuova riga su un sistema operativo diverso da quello che modifica il file. Se tutto il resto fallisce, semplicemente usando un editor esadecimale per inserire il carattere ASCII binario farebbe.


3

Usa PHP nl2br per ottenere le nuove righe in una stringa di testo.

$ text = "Manu è un bravo ragazzo. (Invio) Sa programmare bene.

echo nl2br ($ text);

Risultato.

Manu è un bravo ragazzo.

Sa programmare bene.


1
La nl2brfunzione converte i caratteri di nuova riga nel <br />tag HTML. Se la stringa non contiene alcun carattere di nuova riga, questa funzione non farà nulla! Inoltre, la domanda non riguarda l'interruzione di una riga all'interno di un paragrafo in HTML. Riguarda il personaggio newline !
Damien Flament,

2

Ho anche provato questa combinazione tra virgolette singole e doppie. Ma nessuno ha funzionato. Invece di usare \nmeglio <br/>le doppie virgolette. Come questo..

$variable = "and";
echo "part 1 $variable part 2<br/>";
echo "part 1 ".$variable." part 2";

La domanda non riguarda l'interruzione di una riga all'interno di un paragrafo in HTML. Riguarda il personaggio newline !
Damien Flament,

2

Utilizzare chr (13) per il ritorno a capo e chr (10) per la nuova riga

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo chr (13). chr (10);

2

Per eventuali dichiarazioni di eco, uso sempre <br>all'interno di virgolette doppie.


2
La domanda non riguarda l'interruzione di una riga all'interno di un paragrafo in HTML. Riguarda il personaggio newline !
Damien Flament,

1

Niente funzionava per me.

PHP_EOL

. "\r\n";

$NEWLINE_RE = '/(\r\n)|\r|\n/'; // take care of all possible newline-encodings in input file
$var = preg_replace($NEWLINE_RE,'', $var);

Per me va bene:

$admin_email_Body = $admin_mail_body .'<br>' ."\r\n";
$admin_email_Body .= 'This is line 2 <br>' ."\r\n";
$admin_email_Body .= 'This is line 3 <br>' ."\r\n";

0

You Can Try This.
<?php
   $content = str_replace(PHP_EOL, "<br>", $your_content);
 ?>
 
<p><?php echo($content); ?></p>

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.