Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1492 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Php et expressions régulières

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Php et expressions régulières

n°1854724
jedi0207
Posté le 24-02-2009 à 17:49:31  profilanswer
 

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

mood
Publicité
Posté le 24-02-2009 à 17:49:31  profilanswer
 

n°1854725
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-02-2009 à 17:53:38  profilanswer
 

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.
n°1854726
jedi0207
Posté le 24-02-2009 à 17:55:17  profilanswer
 

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?

n°1854730
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-02-2009 à 17:59:45  profilanswer
 

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.
n°1855910
grosbin
OR die;
Posté le 27-02-2009 à 11:54:03  profilanswer
 

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
n°1855928
FlorentG
Unité de Masse
Posté le 27-02-2009 à 12:56:22  profilanswer
 

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

n°1856141
mIRROR
Chevreuillobolchévik
Posté le 27-02-2009 à 22:11:46  profilanswer
 

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
n°1856536
Bouchon2
Crabe glauque
Posté le 01-03-2009 à 19:02:31  profilanswer
 

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.

n°1856651
FlorentG
Unité de Masse
Posté le 02-03-2009 à 10:41:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Php et expressions régulières

 

Sujets relatifs
[PHP] Expressions régulières... [Résolu][PHP] Prise de tête avec les expressions régulières
[PHP] verification d'email - expressions régulieres[PHP] Expressions régulières... elle marche pas comme je veux...
[PHP - REGEX] J'ai du mal avec les expressions regulières...Question sur les expressions régulières en PHP
[ PHP et autre ] Les expressions régulières.[PHP] Expressions régulières je comprend rien!!! ;-)
[PHP] Expressions régulièresPHP - besoin d'un pro des expressions regulieres (perl ou php)
Plus de sujets relatifs à : Php et expressions régulières


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR