2010-10-11 5 views
0

Je veux remplacer tous les liens que je trouve dans une chaîne, avec une version modifiée de la chaîne, disons par exemple:php et à remplacer

Le renard brun rapide a sauté sur l'http://www.google.com/?v=abc et http://www.google.com/?v=x_y-z
I remplacerait (et modifier) ​​les liens de cette façon, il devient: http://www.google.com/v/abc et http://www.google.com/v/x_y-z

Je sais comment trouver tous les liens en utilisant preg_match_all ($ pattern, $ text, $ sur, PREG_SET_ORDER); et je peux manipuler les chaînes en utilisant preg_split etc - Ceci est fait un à la fois.

Le résultat que je cherche est:

Le renard brun rapide saute à l'eau et http://www.google.com/v/abchttp://www.google.com/v/=x_y-z
Mais comment pourrais-je et à remplacer tous? Toute aide serait grandement appréciée.

+0

Devrait-il y avoir '=' dans 'http: // www.google.com/v/= x_y-z'? – stillstanding

+0

non, tout ce que je veux fondamentalement faire est de changer de URI /? V = requête à URI/v/requête –

Répondre

2

Utilisez preg_replace pour que:

$str = preg_replace('/\?v=([^ ]*)/', '/v/$1', $str); 

Cela suppose que vous voulez tout correspondre après ?v= et le mettre après la /v/. Si ce n'est pas le cas, vous devrez être plus précis sur le motif.

+0

Preg_replace ne fonctionne que sur la première instance trouver, je veux que cela fonctionne sur toutes les instances. –

+1

Non, preg_replace fonctionne sur toutes les instances; la question est juste ce que le modèle correspond. J'ai modifié ma réponse pour inclure un motif plus spécifique - ne comptant que le texte jusqu'au prochain espace. – VoteyDisciple

+0

Ah, oui vous avez raison. Dites par exemple maintenant que vous avez deux URI comme http://www.site.com/watch?v=xyz et http://www.site.com/?v=abc, comment correspondriez-vous à ces deux (sachant que la montre est facultative). Les deux devraient être remplacés par http://www.site.com/v/xyz et http://www.site.com/v/abc –

1

en utilisant les indicateurs g (global) et i (insensible à la casse) devrait étendre la recherche à tout.

$string = preg_replace('/\?v=([^\s]+)/gi','/v/$1', $string); 

Cela suppose qu'il existe un certain type d'espace après votre URL.

+0

Salut, que feriez-vous si l'URL était quelque chose comme http://www.site.com/abc?v=xyz - Comment feriez-vous l'abc? partie aller .ie si l'URI devient http://www.site.com/v/xyz et non http://www.site.com/watch/v/xyz –

+0

modificateur inconnu 'g' est ce que je reçois quand J'essaie ça. –

+0

ah, on dirait que preg_replace est intrinsèquement global. quant à votre question, en php, cela ressemblerait à ceci: preg_replace ('/ \/[^ \? /] + \? ([^ =] +) = ([^ \ s] +) /', '/ $ 1/$ 2 ', $ chaîne); - Cela correspondrait également à site.com/foo?bar=baz et retournerait à site.com/bar/baz – Jesse