Php et expressions régulières

Php et expressions régulières - PHP - Programmation

Marsh Posté le 24-02-2009 à 17:49:31    

Bonjour à tous,
Besoin d'un petit coup de main sur les expressions régulières.
 
j'ai une chaine de caractère de la forme :

Code :
  1. <ul>
  2. <li>blabla
  3.     <ul>
  4.         <li><a lien>blabla</a> blabla<p><a lien><img src="image" alt="" /></a></p><br /></li>
  5.         <li><a href="lien">du texte</a>blabla<p><a href="lien"><img src="image" alt="" /></a></p><br /></li>
  6.        <li><a href="blabla">bla6</a> blabla<p><a href="lien"><img src="image" alt="" /></a></p><br /></li>
  7.     </ul>
  8. </li>
  9. </ul>


Et j'aimerai enlever tout ce qui se trouve entre les balises <p>
J'ai essayé preg_replace("<p><a.*>[^<].*</a></p><br />",'',$item->get_description());
 
Mais ça enlève tout ce qui se trouve entre le premier <p> et le dernier </p>... :cry:
 
Des idées pour résoudre mon problème?
 
Merci d'avance

Reply

Marsh Posté le 24-02-2009 à 17:49:31   

Reply

Marsh Posté le 24-02-2009 à 17:53:38    

Les regexp ne sont pas adaptées pour virer une paire <p></p>
On peut s'en sortir sur ton cas particulier mais pense au jour où tu vas croiser <p><p></p></p> par exemple... globalement les regexp pour chopper un truc parenthésé précis ça marche pas :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-02-2009 à 17:55:17    

Justement je pensais pouvoir virer tout ce qui était contenu dans une paire <p></p> mais qui ne contenait pas de <p>.
 
Si c'est pas possible avec les regexp ya une autre solution ou c'est pas possible du tout ce que je veux faire?

Reply

Marsh Posté le 24-02-2009 à 17:59:45    

jedi0207 a écrit :

Justement je pensais pouvoir virer tout ce qui était contenu dans une paire <p></p> mais qui ne contenait pas de <p>.

 

Si c'est pas possible avec les regexp ya une autre solution ou c'est pas possible du tout ce que je veux faire?

 


Ben pour trouver le </p> correspondant à un <p> spécifique, il te faudrait des regexp avec un compteur, genre +1 quand tu croises <p>, -1 quand tu croises </p>, pour savoir où tu dois t'arrêter.
Et de base le compteur tu l'as pas.

 

Si t'es sur que sur une même ligne ya comme premier <p> le début de ta paire et comme dernier </p> la fin de ta paire, genre :

<li><a lien>blabla</a> blabla<p><a lien><img src="image" alt="" /></a></p><br /></li>


tu peux facilement t'en sortir en traitant ligne par ligne ton truc.

 

Mais bon

<p>
  truc
</p>


c'est valide aussi en html...

 


En perl tu peux écrire :

/foo(?!bar)/


pour trouver n'importe quel foo suivi de non bar

 

Si t'as pas ça, pour non bar faut écrire : non b, ou b mais suivi de non a, ou ba mais suivi de non r

^([^b]|b[^a]|ba[^r])*

 

:o


Message édité par Xavier_OM le 24-02-2009 à 18:20:14

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 27-02-2009 à 11:54:03    

théoriquement ..
* ereg_replace("<p>(.*)</p>","",$string);
remplace la chaine la plus longue possible correspondant à ces critères  
donc les choses comprises entre les paragraphes seront niaquées


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 27-02-2009 à 12:56:22    

Xavier_OM a écrit :

On peut s'en sortir sur ton cas particulier mais pense au jour où tu vas croiser <p><p></p></p> par exemple...


Ca risque pas, si son code est XHTML-valid [:dawa]
 

grosbin a écrit :

théoriquement ..
* ereg_replace("<p>(.*)</p>","",$string);
remplace la chaine la plus longue possible correspondant à ces critères  
donc les choses comprises entre les paragraphes seront niaquées


 
Là c'est greedy. Faut faire la même chose en non-greedy, genre :

Code :
  1. $str = preg_replace('#<p>.+?</p>#', '<p></p>', $str);


Et utiliser PCRE plutôt que les regexp POSIX

Reply

Marsh Posté le 27-02-2009 à 22:11:46    

et une lib DOM ?


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 01-03-2009 à 19:02:31    

Non, c'est FlorentG qui a raison, pour ce genre de situation, la bonne méthode est de "dégloutonner" le masque avec l'option /U (Ungreedy) des PCRE et d'utiliser le cinquième argument optionnel &$count de preg_replace dans une boucle while pour émuler un automate à pile.
 
Cette question est tellement posée qu'elle devrait rejoindre la FAQ.

Reply

Marsh Posté le 02-03-2009 à 10:41:00    

Voilà, soit /U, soit le coup du .+?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed