[PHP] Note : Parser du texte pour en faire des paragraphes

Dans un CMS, quand on doit parser le texte en du HTML, on utilise par exemple le nl2br() pour transformer les retours à la ligne en <br/>. Pour faire beau, on met tout ça dans un <div> et basta.

Sauf que ce n’est pas bien propre.
Le mieux c’est d’utiliser des balises <p>, les <br/> quand il faut (le second en cas d’un retour à la ligne, le premier en bas de deux retours à la ligne successifs, donc avec une ligne blanche entre les deux.

Ça semble simple.
Ça ne l’est pas.

Si votre texte contient déjà du HTML, vous vous retrouverez avec des <p>, des <ul> ou des éléments de type block dans des paragraphes. Ceci n’est pas valide W3C et c’est mal.

Voici une fonction qui prend du texte avec du HTML dedans et qui transforme ça en paragraphes : http://sebsauvage.net/paste/?39bac6fcd6d7e61e#EMx40oNNZwiVmkn3j5FYmjLHudTj9NkZ6J3PQvhNRmM=

Le fonctionnement est simple :
— 1) il analyse la première ligne.
— 2) si c’est un élément HTML de type block, il le passe dans le nl2br(), met ça de côté et retourne au 1)
— 3) sinon, si c’est du texte brute ou un élément de type inline, il grep le texte jusqu’à trouver deux retours à la ligne successifs (marquant le début d’un autre paragraphe) ou un élément de type block. Il capture le texte, le passe au nl2br(), le met entre deux balises <p>, met ça de côté et retourne au 1).

Ainsi, ligne après ligne, le texte est placé entre paragraphes ou conservé si c’est déjà un type block et on reconstitue un code HTML avec des paragraphes.

Mon code n’est pas parfait (il peut encore ajouter des <br/> là où il ne faut pas, par exemple dans un <pre> ou du code HTML mal indenté) mais fonctionne assez bien.