nl2br()
Notre article présente la fonction PHP nl2br(), qui insère des sauts de ligne HTML avant chaque retour à la ligne dans une chaîne.
La fonction PHP nl2br() insère un saut de ligne HTML (<br /> ou <br>) avant chaque caractère de nouvelle ligne (\n, \r\n, \r, ou \n\r) dans une chaîne. C'est l'une des fonctions les plus courantes du développement web PHP, car les retours à la ligne dans du texte brut — ceux qu'un utilisateur tape avec la touche Entrée, ou qui proviennent d'une base de données — sont invisibles en HTML. Les navigateurs regroupent les espaces blancs, de sorte qu'un message multi-lignes affiché directement dans une page s'affiche comme une seule ligne continue. nl2br() comble cet écart en transformant chaque saut de ligne en balise que le navigateur respecte réellement.
Ce chapitre couvre la syntaxe, le paramètre $is_xhtml, ce que nl2br() fait (et ne fait pas) modifier, le cas d'utilisation typique avec la saisie utilisateur, et le problème de sécurité à ne surtout pas ignorer.
Syntaxe
nl2br(string $string, bool $use_xhtml = true): string| Paramètre | Description |
|---|---|
$string | La chaîne d'entrée à traiter. Obligatoire. |
$use_xhtml | Optionnel. Indique si des balises <br /> compatibles XHTML doivent être générées. Par défaut true. Quand false, des balises <br> simples sont utilisées. |
La fonction retourne une nouvelle chaîne avec les sauts insérés ; les chaînes PHP sont immuables, donc le $string original reste inchangé.
Exemple de base
Sortie (le HTML brut reçu par le navigateur) :
Hello<br />
World!Remarquez que le \n original est toujours présent — nl2br() ajoute le <br /> avant la nouvelle ligne, sans la remplacer. C'est intentionnel : cela garde la source lisible lorsque vous affichez le code source de la page, tandis que le <br /> est ce qui force le saut de ligne visible.
Contrôler le style de balise avec $use_xhtml
Passez false comme second argument pour obtenir des balises <br> au style HTML5 au lieu de la forme XHTML auto-fermante :
<?php
echo nl2br("Line 1\nLine 2", false);
?>Sortie :
Line 1<br>
Line 2Utilisez <br /> (la valeur par défaut) pour les documents XHTML ou XML ; les deux formes sont valides en HTML5, donc la valeur par défaut fonctionne presque partout.
Le vrai cas d'utilisation : la saisie utilisateur
La fonction est particulièrement utile lorsque vous affichez du texte soumis par un utilisateur dans un <textarea>. Les navigateurs ignorent les retours à la ligne tapés par l'utilisateur, de sorte que sans nl2br() un commentaire multi-paragraphes s'affiche en un seul bloc. Mais il existe une règle d'ordre cruciale : échapper d'abord, puis insérer les sauts. Si vous exécutez nl2br() sur une entrée brute, vous préservez les sauts de ligne mais laissez la porte ouverte aux attaques XSS, car nl2br() n'échappe pas le HTML — il ajoute uniquement des balises <br>.
<?php
$comment = "Hi there\nThanks for the great post!";
// Correct order: escape the HTML, THEN convert newlines.
echo nl2br(htmlspecialchars($comment));
?>htmlspecialchars() neutralise tout <, > ou & tapé par l'utilisateur, et nl2br() ajoute ensuite des balises <br /> sûres. Inverser l'ordre — htmlspecialchars(nl2br($comment)) — échapperait vos propres balises <br /> en texte visible <br>, de sorte que les sauts ne s'afficheraient jamais.
Pièges courants
- Elle ne supprime ni ne remplace la nouvelle ligne. Le
\nreste dans la chaîne. Si vous avez besoin de supprimer le saut de ligne, exécutezstr_replace()ensuite. - Ce n'est pas une fonction de sécurité.
nl2br()n'effectue aucun échappement. Associez-la toujours àhtmlspecialchars()pour les entrées non fiables. - Elle n'agit que sur les caractères de nouvelle ligne, pas sur le retour à la ligne automatique du
<textarea>— ceux-ci sont visuels uniquement et n'atteignent jamais votre script. - Texte brut uniquement. Envoyer sa sortie dans le corps d'un e-mail ou l'écrire dans un CSV est inutile ; les balises
<br>sont du HTML et ne signifient rien en dehors d'un navigateur.
Fonctions associées
htmlspecialchars()— échapper les caractères spéciaux avant l'affichage (à utiliser conjointement avecnl2br()).str_replace()— remplacer des sous-chaînes, par exemple pour supprimer entièrement les nouvelles lignes.strip-tags()— supprimer les balises HTML d'une chaîne.trim()— supprimer les espaces en début et fin de chaîne, y compris les nouvelles lignes parasites.