Preg_replace

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Preg_replace

par Jeremieca » 11 nov. 2008, 00:08

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

++

par Berzemus » 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...

par Jeremieca » 10 nov. 2008, 23:00

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

++

par Berzemus » 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é)

par Jeremieca » 10 nov. 2008, 15:48

C'est ça oui xd$

++

par fred99 » 10 nov. 2008, 15:16

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

par Jeremieca » 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);

par fred99 » 10 nov. 2008, 02:32

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

Preg_replace

par Jeremieca » 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.

++