PHP: изменить только часть строки URL?

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

У меня есть URL

http://www.example.com/article/paragraph/low/

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

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

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

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

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

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


person Emil Devantie Brockdorff    schedule 14.12.2010    source источник
comment
Все эти обратные косые черты `" meant to be frontslashes "/`? эй не взаимозаменяемы.   -  person Surreal Dreams    schedule 14.12.2010
comment
@ Гордон Не дубликат. Или, по крайней мере, не в этом вопросе.   -  person Alin Purcaru    schedule 14.12.2010
comment
@Алин правильно. Я перепутал parse_str с parse_url.   -  person Gordon    schedule 14.12.2010


Ответы (5)


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

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

как насчет str_replace?

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

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

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

person DamnYankee    schedule 14.12.2010
comment
Слишком неточно. Что делать, если домен пользователя — lowedexpectations.com? - person rik; 14.12.2010

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

person Gumbo    schedule 14.12.2010
comment
Я не думаю, что использование parse_url упрощает его проблему. Это уже очень простая проблема, но он просто не знает, как к ней подойти. - person Alin Purcaru; 14.12.2010
comment
@Алин Пуркару: Дело не в упрощении, а в правильности. - person Gumbo; 14.12.2010
comment
Я думаю, было бы разумно использовать parse_url, если он хочет использовать подход explode. Я имел в виду решение для замены, и для этого было бы бесполезно каким-либо образом менять URL-адрес. - person Alin Purcaru; 14.12.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, только если это последний сегмент, и за ним не может следовать /.

person Alin Purcaru    schedule 14.12.2010
comment
Первый фрагмент заменит /low/ в любой позиции URL-адреса, а не только в конце. - person rik; 14.12.2010
comment
@рик Я знаю. Я добавил альтернативу, если он этого не хочет. - person Alin Purcaru; 14.12.2010

person    schedule
comment
@using split Эта функция УСТАРЕЛА, начиная с PHP 5.3.0. Надеяться на эту функцию крайне не рекомендуется. - person Alin Purcaru; 14.12.2010
comment
Спасибо, Алин, я не знал, что + phpunit не показывал мне предупреждение. Спасибо за информацию. Я обновил фрагмент. - person Alfred; 14.12.2010