Probleme preg_replace - remplace chaine par une autre dans un texte

WRInaute impliqué
Bonjour,

Je galère pour un problème spécifique... quelqu'un pourrait-il m'aider svp?
Problème:

J'ai un texte :

blablabla blabla blablabla blabla blablabla blabla blablabla blabla blablabla blabla http://www.xxxx.com/toto-tatat-titi/HKL5442 blablabla blabla blablabla blabla blablabla blabla blablabla blabla http://www.xxxx.com/toto/HKL5442/yyyyyy blablabla blabla blablabla blabla blablabla blabla blablabla blabla

J'aimerai remplacer les deux urls par http://www.xxxx.com/bob/HKL5442/toto : la seule info importante c'est HKL5442 qui est à récupérer, transformer dans une nouvelle url et remettre à la place...

J'ai un peu manipulé preg_replace mais je m'en sors pas... :(

Une idée?
Merci
Merci
 
WRInaute accro
Quelque chose comme:

Code:
preg_replace('#http://www\.xxxx\.com/[-a-z]+/([A-Z0-9]+)(?:/[a-z]+)?#','http://www.xxx.com/bob/$1/toto',$string)

non?

Evidemment la regex exacte va beaucoup dépendre des formes exactes que peuvent prendre les URLs (lettres, chiffres, etc.).

Jacques.
 
WRInaute impliqué
Ok, ca fonctionne, j'ai juste modifié un peu :
preg_replace('#http://www\.xxxx\.com/[-a-z]+/([A-Za-z0-9]+)(?:/[a-z]+)?#','http://www.xxx.com/bob/$1/toto',$texte);
Car il peut y avoir majuscules et minuscule. Merci poru ton aide en tout cas!
 
WRInaute accro
Comme je disais, sans savoir quel est le format exact des URLs et leur contexte, difficile de te donner une regex précise.

Logiquement, déjà, si c'est /bibi/prod/HKL5442/, il ne devrait pas reconnaître (la regex ne prévoit qu'un seul composant dans le chemin avant le HKL5442). S'il peut y avoir un nombre variable de niveaux avant, il va falloir trouver quel est le format exact du HKL5442 (ce qui permet de le différencier des autres composants).

Pour la partie finale, se pose le problème de savoir comment on trouve la fin de l'URL. Une solution consiste à accepter tout caractère autorisé dans une url, mais dans certains cas ça pose des problèmes (par exemple si je fais une phrase ou je mets une url suivie d'une virgule, ou d'un point, ou entre paranthèses, il n'est pas clair si la virgule, le point ou les parenthèses font partie de l'URL ou pas...). Tu peux au minimum ajouter ?=&0-9%_ dans la classe à la fin, mais ça ne garantit pas que ça "trouve" tout.

Bref, sans un contexte plus précis, difficile de te donner la regex qui marche à coup sûr.

Jacques.
 
WRInaute impliqué
ok, merci, je vais essayer ça.

Ca ferait preg_replace('#http://www\.xxxx\.com/[-a-z]+/([A-Za-z0-9]+)(?:/[a-z]+)?#','http://www.xxx.com/bob/$1/toto?=&0-9%_',$texte); ?
 
WRInaute accro
Non, dans le dernier [a-z]:

preg_replace('#http://www\.xxxx\.com/[-a-z]+/([A-Za-z0-9]+)(?:/[-a-zA-Z?=&0-9%_+]+)?#','http://www.xxx.com/bob/$1/toto',$texte);

(j'ai rajouté une - et + en plus, ainsi que A-Z, même si pour ce dernier la bonne solution c'est probablement de passer en case insensitive en mettant un "i" après le # final)

Jacques.
 
Discussions similaires
Haut