Page 1 sur 1

preg_replace me rend fou !

Posté : 30 juil. 2009, 11:47
par yann41
Hello !

Je cherche à remplacer un texte par un autre dans une page html.
Ma page est contenu dans $home, je fais alors :
echo preg_replace("/\<div id=\"footer\"\> (.?)* \<\/div\>/", "toto", $home);
Je voudrais que <div footer> tous ce qu'il y a ici </div> soit remplacé par 'toto'.
J'ai échappé les guillemets et les < >, mais ca ne fonctionne toujours pas. Je n'ai pas d'erreur, c'est juste qu'il ne reconnait pas le pattern!
Je ne sais pas comment résoudre cela.
Merci pour votre aide!

Re: preg_replace me rend fou !

Posté : 30 juil. 2009, 11:55
par Calimero
Salut,
Ma page est contenu dans $home, je fais alors :
echo preg_replace("/\<div id="footer"\> (.?)* \<\/div\>/", "toto", $home);
Je voudrais que <div footer> tous ce qu'il y a ici </div> soit remplacé par 'toto'.
J'ai échappé les guillemets et les < >, mais ca ne fonctionne toujours pas. Je n'ai pas d'erreur, c'est juste qu'il ne reconnait pas le pattern!
On va partir du pattern :
"/\<div id="footer"\> (.?)* \<\/div\>/"
Déjà, les délimiteurs / (ceux qu'on utilise 95% du temps sans se poser de questions) sont peu adaptés au pattern que tu veux reconnaître puisqu'on les trouve dedans. Pour du html je préfère utiliser l'arobase ( @ ).

Ensuite les chevrons n'ont pas besoin d'être échappés, ils ne correspondent pas à des caractères de commande PCRE.

Tu peux aussi t'épargner l'échappement des guillemets en délimitant ton pattern avec des simples quotes (toujours une bonne idée pour un masque de regexp).

On arrive déjà à ceci :
'@<div id="footer"> (.?)* </div>@'
C'est mieux non ? on continue.

Il y a un problème avec les quantifieurs tels que tu les utilises (ainsi que des espaces en trop), une fois réglé ça donne :
'@<div id="footer">(.*)</div>@'
Enfin pour bien faire je te suggère d'ajouter le modifieur U à ton pattern (ceci pour t'éviter de capturer un truc du genre <div id="footer"><div>plop</div></div>
'@<div id="footer">(.*)</div>@U'
Je te laisse aller voir la documentation PCRE sur php.net pour approfondir tous les points cités. Et bien sûr n'oublie pas de nous dire si ça marche mieux ;-)

Posté : 30 juil. 2009, 12:16
par Victor BRITO
Et pour tester l'expression rationnelle en soi, rien ne vaut Lumadis, de notre ami Ripat. ;)

Re: preg_replace me rend fou !

Posté : 30 juil. 2009, 14:03
par niuxe
Hello tout le monde,

yann41 => Dans un premier temps, je peux également te conseiller de faire une selection (preg_match) et voir ce qu'il capture d'après ta pattern. ;)
Enfin pour bien faire je te suggère d'ajouter le modifieur U à ton pattern
Bien vu (dit l'aveugle). :)

Victor BRITO => Merci pour ton lien. Hop, dans le marque page ! ^^

Posté : 30 juil. 2009, 14:24
par yann41
Merci bcp pôur tes explications. C'est plus clair maintenant !

Pour le pattern, ca marche presque bien ;)
En fait j'ai des espace, des \t et des \n\r dans les chaines donc j'ai lu qu'il fallait utiliser 's' en plus pour les prendre en compte :
'@<div id="footer">(.*)</div>@sU'
Et là c'est parfait :)
Merci pour le lien http://lumadis.be/regex/test_regex.php que je ne connaissais pas, c'est bookmarké :)
Ciao 8-)