PHP: изменить только часть строки URL? - PullRequest
2 голосов
/ 14 декабря 2010

Я работаю над небольшим хиппи-проектом, в котором я хочу заменить определенную страницу в URL.Позвольте мне объяснить:

У меня есть URL http://www.mydomain.com/article/paragraph/low/

Я хочу сохранить URL, но заменил последний сегмент / low / на / high / , поэтому новый URL-адрес:

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

Я пробовал разные способы разнесения, разделения и сплайсинга, но я просто не могуоберните мою голову вокруг этого и заставьте это работать.Я могу изменить весь URL, а не только последний сегмент, и сохранить его в новой переменной.
Я вполне уверен, что это довольно простой случай, но я никогда не работал так много с массивами / строковыми манипуляциямив PHP, поэтому я довольно растерялся.

Я думаю, что сначала я должен разбить URL на сегменты, используя "\", чтобы отделить его (я пытался это сделать, но у меня возникли проблемы с использованием explode ("\", $ string)) и затем замените последний \ low \ на \ high \

Надеюсь, кто-то может помочь или указать мне в правильном направлении, какие методы использовать для этого.

Искренняя
Местика

Ответы [ 5 ]

3 голосов
/ 14 декабря 2010

Вы взяли \ за /.

$url = explode('/', rtrim($url, '/'));
if (end($url) == 'low') {
    $url[count($url)-1] = 'high';
}
$url = implode('/', $url) .'/';
3 голосов
/ 14 декабря 2010

как насчет str_replace?

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

документация;http://php.net/manual/en/function.str-replace.php

редактировать;Рик прав;если ваш домен (или любая другая часть URL) содержит строку «low», это испортит вашу ссылку.Итак: если ваш URL может содержать несколько 'low', вам нужно будет добавить дополнительный индикатор в скрипт.Примером этого может быть включение / s в ваш str_replace.

1 голос
/ 14 декабря 2010

Используйте parse_url, чтобы разделить URL-адрес на его компоненты, измените их при необходимости (здесь вы можете использовать explode, чтобы разбить путь на его сегменты), а затем перестройте URL с помощью http_build_url.

1 голос
/ 14 декабря 2010
<?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)
0 голосов
/ 14 декабря 2010

Этого, вероятно, будет достаточно:

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

или с регулярными выражениями (это обеспечивает большую гибкость)

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

Обратите внимание, что строковый подход заменит любой сегмент low и только если за ним следует /. Подход регулярного выражения заменит low только в том случае, если это последний сегмент, и за ним не может следовать /.

...