2010-12-14 39 views
0

Je travaille sur un petit projet hoppy où je veux remplacer une page spécifique sur une URL. Laissez-moi vous expliquer:PHP: Changer seulement une partie d'une chaîne d'URL?

J'ai l'URL http://www.mydomain.com/article/paragraph/low/

Je veux garder l'URL, mais remplacer le dernier segment /bas/ avec /haut/ de sorte que la nouvelle URL est:

http://www.mydomain.com/article/paragraph/high/

J'ai essayé différentes exploser, split et épissures mais Je n'arrive juste pas à envelopper ma tête et à le faire fonctionner. Je peux changer l'URL entière mais pas seulement le dernier segment et l'enregistrer dans une nouvelle variable.
Je suis assez confiant que c'est un cas assez simple, mais je n'ai jamais travaillé autant avec arrays/string-manipulation en PHP, donc je suis assez perdu. Je suppose que je dois d'abord scinder l'URL en segments, en utilisant le "\" pour le séparer (j'ai essayé cela mais j'ai des problèmes en utilisant explode ("\", $ string)), puis remplacer le dernier \ low \ with \ high \

J'espère que quelqu'un pourrait m'aider ou me diriger dans la bonne direction vers les méthodes à utiliser pour ce faire.

Sincère
Mestika

+0

Est-ce que toutes les barres obliques inverses "' '' doivent être frontslashes "'/'"? Ils ne sont pas interchangeables. –

+1

@Gordon Pas un doublon. Ou du moins pas de cette question. –

+0

@Alin correct. J'ai confondu parse_str avec parse_url. – Gordon

Répondre

3

Vous avez pris \ pour /.

$url = explode('/', rtrim($url, '/')); 
if (end($url) == 'low') { 
    $url[count($url)-1] = 'high'; 
} 
$url = implode('/', $url) .'/'; 
0

Ce sera probablement assez:

$url = "http://www.mydomain.com/article/paragraph/low/"; 
$newUrl = str_replace('/low/', '/high/', $url); 

ou avec des expressions régulières (elle permet une plus grande flexibilité)

$url = "http://www.mydomain.com/article/paragraph/low/"; 
$newUrl = preg_replace('/low(\/?)$/', 'high$1', $url); 

Notez que l'approche de chaîne remplacera tout low et seulement s'il est suivi d'un /. L'approche regex remplacera low seulement si c'est le dernier segment et il ne peut pas être suivi d'un /.

+0

Le premier extrait remplacerait "/ low /" à n'importe quelle position dans l'URL, et pas seulement à la fin. – rik

+0

@rik Je sais. J'ai ajouté une alternative s'il ne le veut pas. –

3

Qu'en est-il de str_replace?

<?php 
$newurl = str_replace('low', 'high', $oldurl); 
?> 

documentation; http://php.net/manual/en/function.str-replace.php

modifier; Rik a raison; Si votre domaine (ou toute autre partie de l'URL) inclut la chaîne "low", cela gâchera votre lien. Donc: si votre URL peut contenir plusieurs 'low', vous devrez ajouter un indicateur supplémentaire dans le script. Un exemple de cela serait d'inclure les/dans votre str_replace.

+0

Trop imprécis. Que faire si le domaine de l'utilisateur est reducedexpectations.com? – rik

1
<?php 

class TestURL extends PHPUnit_Framework_TestCase { 
    public function testURL() { 
     $URL = 'http://www.mydomain.com/article/paragraph/low/'; 
     $explode = explode('/', $URL); 
     $explode[5] = 'high'; 
     $expected = 'http://www.mydomain.com/article/paragraph/high/'; 
     $actual = implode('/', $explode); 
     $this->assertEquals($expected, $actual); 
    } 
} 

-

phpunit simple-test.php 
PHPUnit 3.4.13 by Sebastian Bergmann. 

. 

Time: 0 seconds, Memory: 4.75Mb 

OK (1 test, 1 assertion) 
+1

@using 'split'" Cette fonction a été DÉPRÉCIÉE à partir de PHP 5.3.0 Il est fortement déconseillé de se fier à cette fonctionnalité. " –

+0

Merci Alin Je ne savais pas que + phpunit ne m'a pas montré l'avertissement. Merci pour l'info. J'ai mis à jour l'extrait. – Alfred

1

Utilisez parse_url pour diviser l'URL dans ses composants, les modifier au besoin (ici, vous pouvez utiliser explode pour diviser le chemin d'accès dans ses segments), puis reconstruire l'URL avec http_build_url.

+0

Je ne pense pas que l'utilisation de 'parse_url' simplifie son problème. C'est déjà un problème très simple, mais il ne sait tout simplement pas comment l'aborder. –

+2

@Alin Purcaru: Il ne s'agit pas de simplification mais de correction. – Gumbo

+0

Je suppose que cela aurait un sens d'utiliser 'parse_url' s'il veut utiliser une approche' explode'. J'avais en tête une solution de remplacement et pour cela il serait inutile de changer l'URL de quelque façon que ce soit. –