Php et expressions régulières - PHP - Programmation
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
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?
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> |
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])* |
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
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
grosbin a écrit : théoriquement .. |
Là c'est greedy. Faut faire la même chose en non-greedy, genre :
Code : |
Et utiliser PCRE plutôt que les regexp POSIX
Marsh Posté le 27-02-2009 à 22:11:46
et une lib DOM ?
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.
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 :
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>...
Des idées pour résoudre mon problème?
Merci d'avance