Preg_replace

Eléphant du PHP | 50 Messages

10 nov. 2008, 02:10

Bonjour à tous,

J'utilise preg_replace() dans une fonction et il marche bien sauf que si j'ai plusieurs chaines identiques, par exemple :

$texte = le chien cours après le lapin dans le couloir.

et que je demande de remplacer le par la hé bien il me renvoi :

la chien cours après le lapin dans le couloir.

Or je voudrais :

la chien cours après la lapin dans la couloir.

Merci d'avance pour votre aide.

++
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.

Eléphanteau du PHP | 10 Messages

10 nov. 2008, 02:32

Salut.
Montre nous ton code que l'on puisse t'aider ;)

Eléphant du PHP | 50 Messages

10 nov. 2008, 10:19

Voici :
$page = preg_replace('#functions\.(.+)\.php#', 'http://www.fr.php.net/manual/fr/functions.$1.php', $page);
$page = preg_replace('#language\.(.+)\.php#', 'http://www.fr.php.net/manual/fr/language.$1.php', $page);
$page = preg_replace('#ini\.(.+)\.php#', 'http://www.fr.php.net/manual/fr/ini.$1.php', $page);
Merci d'avance !!

++

EDIT : J'ai trouvé, Il suffit de mettre :
$page = preg_replace('#functions\.(.+)\.php#U', 'http://www.fr.php.net/manual/fr/functions.$1.php', $page);
$page = preg_replace('#language\.(.+)\.php#U', 'http://www.fr.php.net/manual/fr/language.$1.php', $page);
$page = preg_replace('#ini\.(.+)\.php#U', 'http://www.fr.php.net/manual/fr/ini.$1.php', $page);
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.

Eléphanteau du PHP | 10 Messages

10 nov. 2008, 15:16

Comme quoi on est mieux servi que par soi méme :D

Eléphant du PHP | 50 Messages

10 nov. 2008, 15:48

C'est ça oui xd$

++
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.

ViPHP
ViPHP | 4039 Messages

10 nov. 2008, 22:34

Tu sais au moins d'ou te venait ton problème ? :wink:
(pas que je sais pas hein, mais c'est juste par curiosité)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 50 Messages

10 nov. 2008, 23:00

Le U sert à passer à la suivante je crois mais un peu plus de détails seraient pratique^^

++
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.

ViPHP
ViPHP | 4039 Messages

10 nov. 2008, 23:51

Non. Le U est pour "Ungreedy", ou encore, pour NonAvare.

Le truc avec quelque chose comme .+, c'est qu'il est avare: il ne vas pas s'arrêter a la première occasion, mais à la dernière.

Donc si tu fais:

Code : Tout sélectionner

.+\.php
Et que tu as le malheur d'avoir plusieurs .php dans ton fichier, il va te prendre depuis le début de la première occurrence jusqu'à la fin du dernier.

Il y a des raison fortement techniques, mais je les épargne juste maintenant.

En spécifiant le U, tu le rends non-avare.

Une meilleure façon de faire, puisque ce que tu cherches a capturer c'est "tout jusqu'au prochain .php", et donc en plus mieux dit, jusqu'au prochain point (.).

Tu peux donc laisser ton expression tout ce qui n'est pas un point:

Code : Tout sélectionner

[^\.]+\.php
Et il va s'arrêter au premier point.

Un autre avantage sur la première solution, est qu'elle est plus rapide. Il me semble me souvenir que dans le premier cas, regex commence en fait sa recherche a partir de la fin du fichier, et vient progressivement en arrière jusqu'à ce qu'il rencontre quelques chose qui valide l'expression.

dans ce deuxième cas, il commence la ou on l'a laissé, et avance jusqu'à valider l'expression.

Si le contenu à traiter est un tant soit peu long, la seconde solution est bien plus rapide.

Donc, ma proposition à 3 francs:
$page = preg_replace('#functions\.[^\.]+\.php#', 'http://www.fr.php.net/manual/fr/functions.$1.php', $page);
$page = preg_replace('#language\.[^\.]+\.php#', 'http://www.fr.php.net/manual/fr/language.$1.php', $page);
$page = preg_replace('#ini\.[^\.]+\.php#', 'http://www.fr.php.net/manual/fr/ini.$1.php', $page);
Ca marche bien sur que si il n'y a pas de point dans ce que tu souhaites capturer...
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 50 Messages

11 nov. 2008, 00:08

Pas mal ! j'adore l'explication merci beaucoup !!

++
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.