8791 sujets

Développement web côté serveur, CMS

Bonjour,
je souhaite supprimer les balise <p> d'un code html lorsque le contenu est vide :
<p></p>

ou
<p> </p>

ou
<p>&nbsp;</p>


je me suis donc mis à ereg en php ... pas évident au premier abord. Voilà ce que ça donne pour le premier exemple:

$str_Texte = '<p></p><p>Ceci est un <strong>test</strong></p>';
echo $str_Texte;
echo '<hr />';
$str_Texte = ereg_replace('<p></p>', '', $str_Texte);
echo $str_Texte;


Le paragraphe vide est bien supprimé. Le problème, c'est qu'il peut y avoir des attributs dans un paragraphe:
<p style=""></p>


étant vraiment débutant avec ereg, je cherche de l'aide pour réaliser un masque qui me permette de supprimer tout les paragraphes vide quelque soit leurs attributs.

Merci d'avance
Modifié par Francois44 (01 Apr 2007 - 23:55)
Bonsoir.

La tache va être ardue, avec les regex. Par contre, avec dom, c'est beaucoup plus simple.

Le prérequis est de disposer du code html bien formé au sens xml du terme. Donc, au format xhtml.

L'idée est de charger le fichier html dans un DOMDocument (php 5), et de tester toutes la balises P pour vérifier si elles sont vides, et dans ce cas, les suprimer.

Ainsi, quelsque-soient les attributs, ou le style de vide (rien, espace, espace insécable, et même retours à la ligne), la balise p serait identifiée comme vide et suprimable.


$doc = new DOMDocument();
$doc->load('fichier.html');
$nodes=$doc->getElementsByTagName('p');
foreach($nodes as $node)
{
    if (strlen(trim($node->nodeValue)) == 0) // que des espaces
   {
       // suprimer le noeud (formule tordu, mais dom)
       $node->parentNode->removeChild($node);
   }
}
$doc->save('fichier.html');


C'est de mémoire. Rien ne dit que ça marche du premier coup, mais c'est ensuite adaptable à d'autres balises vides comme div, ou autres...

Mais, comme il y a toujours des "mais", l'objet DOMDocument n'accepte pas les entités comme &nbsp; Donc, pour faire fonctionner ce code, il faudrait remplacer les entités par leur équivalents numériques, (&#160; pour nbsp...)

En espérant que celà donne tout de même quelques idées...
Modifié par GeorgesM (30 Mar 2007 - 22:39)
Merci pour ton aide GeorgesM. Pour des raisons pratique (comme tu l'as fait remarqué, les caractères HTML ne sont pas valide dans le format xml), j'ai persisté dans les ereg.

Et après quelques heures à cogiter (toute la nuit environ ...), je suis arrivé à ce que je voulais:

$str_Texte = '<p></p><p>Ceci est un <strong>test</strong></p><p style="zqrazr" align="qqsf"></p>';

$str_Texte = eregi_replace('(<p [^<]*["|\']?([^ "\']*)["|\']?[^>].*></p>)','', $str_Texte);
echo $str_Texte;


étant encore novice avec les ereg, si quelqu'un voit une solution plus simple, je suis preneur. Smiley cligne
Modifié par Francois44 (31 Mar 2007 - 05:30)
Bonjour.

(pas trop la gueule de bois ?)

En l'état, la regex ne peut pas gérer les balises p ne contenant que des espaces, comme <p> </p> ou <p>&nbsp;</p>

De plus, pour isoler les balises vides avec ou sans attribut, cette cellule suffirait :

<p[^<]*></p>


C'est donc entre la balise ouvrante et la balise fermante qu'il faut trouver quelque chose...

Je suggère :


<p[^<]*>[\s]*</p>


le \s va couvrir les espaces, tabulations et retour chariot.

Mais quid des espaces nbsp ?

Bon courage...
Modifié par GeorgesM (31 Mar 2007 - 08:58)
Je me rapproche de ce que je souhaite, mais il me reste encore un soucis.

voilà mon code HTML test:

$str_Texte = "
<p>TEST</p>
<p></p>
<p width=\"400\" height=\"300\"></p>
<p> </p>
<p>     </p>
<p>\n</p>
<p>&nbsp;</p>";


et mon code PHP

$str_Texte = eregi_replace("<p[^>]*>[\s|&nbsp;]*</p>",'', $str_Texte);
echo '<pre>'.htmlentities($str_Texte).'</pre>';


ce qui affiche:

<p>TEST</p>


<p> </p>
<p>     </p>
<p>
</p>


Il faudrait que je puisse modifier mon masque pour obtenir :

<p>TEST</p>


J'ai l'impression que les retour à la ligne ainsi que les espaces ne sont pas pris en compte ... je ne comprend pas étant donné que "\s" correspond à tout espace blanc, y compris l'espace, la tabulation, le saut de page, etc.

Est-ce que j'ai raté quelque chose?
Modifié par Francois44 (01 Apr 2007 - 01:56)
Julien Royer a écrit :
Bonjour. Smiley smile Pourquoi pas

<p[^>]*></p>
?


Oui, bien sur. Smiley mur

Ce soir, je ne suis pas fier (trop fait la fête...).

J'ai ça :


$str_Texte = eregi_replace("<p[^>]*>[[:space:]|&nbsp;]*</p>", "", $str_Texte);

Modifié par GeorgesM (01 Apr 2007 - 21:20)
Salut d'un même pas débutant.
Comment supprimer les images (balise <img.../> voire <img...></img>) de ma chaine de caratères $DESCRIPTION ?
Salut guenael,

Pourrais tu ouvrir ton propre sujet au lieu d'utiliser un sujet déja vieux de plusieurs mois, qui présente un autre problème, et qui plus est, est marqué comme résolu. Tu risques d'avoir peu de réponses présentement, alors que ton propre sujet aura plus de chance d'aboutir. Smiley cligne
j'aurai fait quelque chose du genre :

ereg_replace("<p>[[:blank:]*]</p>", "", $string);

Modifié par Rasta31 (07 Oct 2007 - 02:24)