Page 1 sur 1

Preg_replace

Posté : 10 nov. 2008, 02:10
par Jeremieca
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.

++

Posté : 10 nov. 2008, 02:32
par fred99
Salut.
Montre nous ton code que l'on puisse t'aider ;)

Posté : 10 nov. 2008, 10:19
par Jeremieca
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);

Posté : 10 nov. 2008, 15:16
par fred99
Comme quoi on est mieux servi que par soi méme :D

Posté : 10 nov. 2008, 15:48
par Jeremieca
C'est ça oui xd$

++

Posté : 10 nov. 2008, 22:34
par Berzemus
Tu sais au moins d'ou te venait ton problème ? :wink:
(pas que je sais pas hein, mais c'est juste par curiosité)

Posté : 10 nov. 2008, 23:00
par Jeremieca
Le U sert à passer à la suivante je crois mais un peu plus de détails seraient pratique^^

++

Posté : 10 nov. 2008, 23:51
par Berzemus
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...

Posté : 11 nov. 2008, 00:08
par Jeremieca
Pas mal ! j'adore l'explication merci beaucoup !!

++