par
fury_fatal » 25 sept. 2020, 17:04
Oui,
echo '<p>'.nl2br($article['content']).'</p>'; pose problème quand il y a un titre au milieu d'un paragraphe.
Exemple qui va poser problème :
Code : Tout sélectionner
Bonjour ! Un texte de la BDD.
<h2>Un texte de la BDD.</h2>
Je suis un texte <strong>gras</strong> de la base de données
J'ai donc pensé à créer une fonction :
Code : Tout sélectionner
function addHtmlTags($para) {
$clean = nl2br($para); // Remplace saut de ligne par <br />
$clean = str_ireplace('<br />', '<br>', $clean); // Remplace tous les <br /> par <br>
$clean = preg_replace("#\n|\r|\t#", "", $clean); // Remplace Nouvelle ligne (\n), Retour-chariot (\r) et Tabulation (\t) par du vide. Cela les efface
$clean = preg_replace('/(\>)\s*(\<)/m', '$1$2', $clean); // Supprimer les espaces entre les balises HTML. Exemple: <ul> <li> devient <ul><li>
$clean = '<p>'.$clean.'</p>'; // Ajouter <p></p>
$clean = str_replace('<br><br><br>', '<br><br>', $clean); // Remplace les <br> en trop
$clean = str_replace('<br><br>', '</p><p>', $clean); // Remplace tous les <br><br> par </p><p>.
$remplacement = ["<p><h1"=>"<h12", "</h1></p>"=>"</h1>", "<p><h2"=>"<h2", "</h2></p>"=>"</h2>", "<p><h3"=>"<h3", "</h3></p>"=>"</h3>", "<p><h4"=>"<h4", "</h4></p>"=>"</h4>", "<p><h5"=>"<h5", "</h5></p>"=>"</h5>", "<p><h6"=>"<h6", "</h6></p>"=>"</h6>", "<p><ul><br>"=>"<ul>", "<br></ul></p>"=>"</ul>", "<p><ul"=>"<ul", "</ul></p>"=>"</ul>"];
$clean = strtr($clean, $remplacement); // Nettoyage
$remplacement = ["<p></p>"=>"", "<p><br>"=>"", "<br><li"=>"<li", "</li><br>"=>"</li>"];
$clean = strtr($clean, $remplacement); // Dernier nettoyage
return $clean;
}
Je fais un petit test :
Code : Tout sélectionner
$texte = '<h2 class="h2-gr">Un titre</h2>
Je suis un texte.
<h3 class="h3-gr">Titre 3</h3>
<ul>
<li>Liste 1</li>
<li>Liste 2</li>
</ul>
<h3 class="h3-gr">Un autre titre</h3>
<ul>
<li>Liste 3</li>
<li>Liste 4</li>
<li>Liste 5</li>
</ul>
Je suis un texte.';
echo addHtmlTags($texte);
Le html généré est bien ce que je désire (j'ai indenté pour une meilleure lecture) :
Code : Tout sélectionner
<h2 class="h2-gr">Un titre</h2>
<p>Je suis un texte.</p>
<h3 class="h3-gr">Titre 3</h3>
<ul>
<li>Liste 1</li>
<li>Liste 2</li>
</ul>
<h3 class="h3-gr">Un autre titre</h3>
<ul>
<li>Liste 3</li>
<li>Liste 4</li>
<li>Liste 5</li>
</ul>
<p>Je suis un texte.</p>
Je trouve ma méthode un peu "bricolage". Avez-vous une meilleure méthode ?
Oui,
echo '<p>'.nl2br($article['content']).'</p>'; pose problème quand il y a un titre au milieu d'un paragraphe.
Exemple qui va poser problème :
[code]
Bonjour ! Un texte de la BDD.
<h2>Un texte de la BDD.</h2>
Je suis un texte <strong>gras</strong> de la base de données
[/code]
J'ai donc pensé à créer une fonction :
[code]
function addHtmlTags($para) {
$clean = nl2br($para); // Remplace saut de ligne par <br />
$clean = str_ireplace('<br />', '<br>', $clean); // Remplace tous les <br /> par <br>
$clean = preg_replace("#\n|\r|\t#", "", $clean); // Remplace Nouvelle ligne (\n), Retour-chariot (\r) et Tabulation (\t) par du vide. Cela les efface
$clean = preg_replace('/(\>)\s*(\<)/m', '$1$2', $clean); // Supprimer les espaces entre les balises HTML. Exemple: <ul> <li> devient <ul><li>
$clean = '<p>'.$clean.'</p>'; // Ajouter <p></p>
$clean = str_replace('<br><br><br>', '<br><br>', $clean); // Remplace les <br> en trop
$clean = str_replace('<br><br>', '</p><p>', $clean); // Remplace tous les <br><br> par </p><p>.
$remplacement = ["<p><h1"=>"<h12", "</h1></p>"=>"</h1>", "<p><h2"=>"<h2", "</h2></p>"=>"</h2>", "<p><h3"=>"<h3", "</h3></p>"=>"</h3>", "<p><h4"=>"<h4", "</h4></p>"=>"</h4>", "<p><h5"=>"<h5", "</h5></p>"=>"</h5>", "<p><h6"=>"<h6", "</h6></p>"=>"</h6>", "<p><ul><br>"=>"<ul>", "<br></ul></p>"=>"</ul>", "<p><ul"=>"<ul", "</ul></p>"=>"</ul>"];
$clean = strtr($clean, $remplacement); // Nettoyage
$remplacement = ["<p></p>"=>"", "<p><br>"=>"", "<br><li"=>"<li", "</li><br>"=>"</li>"];
$clean = strtr($clean, $remplacement); // Dernier nettoyage
return $clean;
}
[/code]
Je fais un petit test :
[code]
$texte = '<h2 class="h2-gr">Un titre</h2>
Je suis un texte.
<h3 class="h3-gr">Titre 3</h3>
<ul>
<li>Liste 1</li>
<li>Liste 2</li>
</ul>
<h3 class="h3-gr">Un autre titre</h3>
<ul>
<li>Liste 3</li>
<li>Liste 4</li>
<li>Liste 5</li>
</ul>
Je suis un texte.';
echo addHtmlTags($texte);
[/code]
Le html généré est bien ce que je désire (j'ai indenté pour une meilleure lecture) :
[code]
<h2 class="h2-gr">Un titre</h2>
<p>Je suis un texte.</p>
<h3 class="h3-gr">Titre 3</h3>
<ul>
<li>Liste 1</li>
<li>Liste 2</li>
</ul>
<h3 class="h3-gr">Un autre titre</h3>
<ul>
<li>Liste 3</li>
<li>Liste 4</li>
<li>Liste 5</li>
</ul>
<p>Je suis un texte.</p>[/code]
Je trouve ma méthode un peu "bricolage". Avez-vous une meilleure méthode ?