Page 1 sur 1

Utilisation de preg_replace

Posté : 07 juil. 2009, 17:12
par Toons43
Bonjour à tous,

J'utilise la fonction preg_replace dans une page que je developpe et je voudrais remplacer uniquement la 3eme, la 4eme et la 7eme occurence de ma chaine.

Est-ce possible avec cette fonction et si oui comment faire?
Si ce n'est pas possible connaissez vous un autre moyen

D'avance merci de vos réponses

Posté : 07 juil. 2009, 17:57
par Genova
Tu peux préciser un paramètre en guise de 4ème argument à preg_replace(), qui te permettra de ne remplacer les occurrences que une par une. Avec un compteur tu peux savoir à quelle occurrence tu te trouves, remplacer celles qui ne t'intéressent pas par une chaîne lambda, remplacer les trois occurrences que tu veux par la chaîne finale, et remplacer les chaînes lambda par leur chaînes de départ.

Ca devrait marcher :)

Posté : 07 juil. 2009, 21:32
par Toons43
Merci pour cette réponse

C'est une bonne idée, je vais tester ça

Posté : 09 juil. 2009, 11:16
par Hywan
Hey :-),

Sinon, il te suffit de ne pas capturer la première, la deuxième, la cinquième et la sixième occurence ... Normalement, tu utilises des parenthèses capturantes pour ... capturer tes occurences. Soit tu les enlèves (si c'est possible), soit tu utilises des parenthèses non-capturantes. Exemple :

Code : Tout sélectionner

(je suis capturé) (?:je ne suis pas capturé)
Cette solution est beaucoup plus pertinente que celle de Genova à mon avis :-) (sans animosité aucune ;-)).

Question indiscrète : est-ce qu'on peut voir ton expression régulière ?

Posté : 09 juil. 2009, 11:33
par Genova
Si c'est possible de le faire comme tu précises c'est effectivement beaucoup plus pertinent, mais je suis curieux de voir le code fonctionnel final pour résoudre le problème avec cette idée :)

Posté : 09 juil. 2009, 11:59
par Hywan
D'où ma demande pour avoir son expression régulière sous les yeux, mais j'ai déjà donné la réponse.
Par exemple :
on souhaite reconnaître az:42@hoa

Code : Tout sélectionner

(\w):(\d)@(\w)
est correct, mais on capture 3 parties. On souhaite ne capturer que ce qui est après l'arobase :

Code : Tout sélectionner

\w:\d@(\w)
Hop. Sauf que parfois, les parenthèses sont utiles, et ne peuvent pas être enlevées. Ce n'est pas le cas ici, mais imaginons, alors :

Code : Tout sélectionner

(?:\w):(?:\d)@(\w)
ne capturera que la dernière partie.

Posté : 09 juil. 2009, 12:40
par Genova
Je suis d'accord, je connais les assertions, mais je ne vois pas concrètement comment les utiliser pour dire "je remplace uniquement les occurences 3, 4 et 7".

Posté : 09 juil. 2009, 12:45
par Hywan
Bah au lieu de dire : on remplace uniquement les 3, 4 et 7ème, on dit : on remplace toutes les occurences, et grâce aux assertions, toutes les occurences sont les 3, 4 et 7ème :-).

Mais si je demande à voir son expression, c'est qu'il peut peut-être effectuer plusieurs traitements dessus. Dans ce cas, j'irais du côté de preg_replace_callback() plutôt.

Posté : 09 juil. 2009, 14:03
par Sékiltoyai
Bah au lieu de dire : on remplace uniquement les 3, 4 et 7ème, on dit : on remplace toutes les occurences, et grâce aux assertions, toutes les occurences sont les 3, 4 et 7ème :-).
Pas mieux en fait.
Je dois avouer que je ne comprenais pas la question, mais ca c'est pour moi la réponse la plus logique.