nl2br()
Articolo sulla funzione PHP nl2br(), che inserisce interruzioni di riga HTML prima di ogni carattere di nuova riga in una stringa.
La funzione PHP nl2br() inserisce un'interruzione di riga HTML (<br /> o <br>) prima di ogni carattere di nuova riga (\n, \r\n, \r o \n\r) in una stringa. È una delle funzioni più comuni nello sviluppo web con PHP, perché le nuove righe nel testo normale — quelle che un utente inserisce premendo il tasto Invio, o che provengono da un database — sono invisibili in HTML. I browser comprimono gli spazi bianchi, quindi un messaggio su più righe visualizzato direttamente in una pagina appare come un'unica riga continua. nl2br() colma questa lacuna trasformando ogni interruzione di riga in un elemento di markup che il browser interpreta correttamente.
Questo capitolo tratta la sintassi, il parametro $is_xhtml, cosa fa (e non fa) nl2br(), il caso d'uso tipico con l'input dell'utente e il problema di sicurezza che non bisogna mai ignorare.
Sintassi
nl2br(string $string, bool $use_xhtml = true): string| Parametro | Descrizione |
|---|---|
$string | La stringa di input da elaborare. Obbligatorio. |
$use_xhtml | Facoltativo. Determina se emettere tag <br /> compatibili con XHTML. Il valore predefinito è true. Se false, vengono usati tag <br> semplici. |
La funzione restituisce una nuova stringa con le interruzioni inserite; le stringhe PHP sono immutabili, quindi la $string originale rimane invariata.
Esempio base
Output (l'HTML grezzo ricevuto dal browser):
Hello<br />
World!Si noti che il \n originale è ancora presente — nl2br() aggiunge il <br /> prima della nuova riga, non la sostituisce. Questo è intenzionale: mantiene la leggibilità del sorgente quando si visualizza il codice sorgente della pagina, mentre è il <br /> a forzare l'interruzione di riga visibile.
Controllo dello stile del tag con $use_xhtml
Passare false come secondo argomento per ottenere tag <br> in stile HTML5 invece della forma XHTML con chiusura automatica:
<?php
echo nl2br("Line 1\nLine 2", false);
?>Output:
Line 1<br>
Line 2Usare <br /> (il valore predefinito) per documenti XHTML o XML; entrambe le forme sono valide in HTML5, quindi il valore predefinito funziona quasi ovunque.
Il caso d'uso reale: l'input dell'utente
La funzione è particolarmente utile quando si visualizza il testo inviato da un utente tramite un <textarea>. I browser ignorano le nuove righe digitate dall'utente, quindi senza nl2br() un commento su più paragrafi viene visualizzato come un unico blocco. Esiste però una regola fondamentale sull'ordine delle operazioni: prima si esegue l'escape, poi si aggiungono le interruzioni. Se si esegue nl2br() sull'input grezzo si proteggono le interruzioni di riga ma si lascia aperta la porta agli attacchi XSS, perché nl2br() non esegue l'escape dell'HTML — aggiunge solo i tag <br>.
<?php
$comment = "Hi there\nThanks for the great post!";
// Correct order: escape the HTML, THEN convert newlines.
echo nl2br(htmlspecialchars($comment));
?>htmlspecialchars() neutralizza qualsiasi <, > o & digitato dall'utente, dopodiché nl2br() aggiunge tag <br /> sicuri. Invertire l'ordine — htmlspecialchars(nl2br($comment)) — eseguirebbe l'escape dei propri tag <br /> trasformandoli nel testo visibile <br>, quindi le interruzioni non verrebbero mai visualizzate.
Errori comuni
- Non rimuove né sostituisce la nuova riga. Il carattere
\nrimane nella stringa. Se si ha bisogno di eliminare l'interruzione di riga, eseguirestr_replace()in seguito. - Non è una funzione di sicurezza.
nl2br()non esegue alcun escape. Usarla sempre insieme ahtmlspecialchars()con input non attendibile. - Agisce solo sui caratteri di nuova riga, non sul ritorno a capo visivo di
<textarea>— quelli sono solo visivi e non raggiungono mai lo script. - Solo per testo normale. Inviarne l'output come corpo di un'email o scriverlo in un CSV è inutile; i tag
<br>sono HTML e non hanno significato al di fuori di un browser.
Funzioni correlate
htmlspecialchars()— eseguire l'escape dei caratteri speciali prima dell'output (da usare insieme anl2br()).str_replace()— sostituire sottostringhe, ad esempio per rimuovere completamente le nuove righe.strip-tags()— rimuovere i tag HTML da una stringa.trim()— eliminare gli spazi bianchi iniziali e finali, incluse le nuove righe superflue.