Есть ли PHP-библиотека, которая обрабатывает параметры URL, добавляя, удаляя или заменяя? - PullRequest
2 голосов
/ 26 мая 2009

когда мы добавляем параметр к URL

$ redirectURL = $ printPageURL. "Режим = 1?";

работает, если $ printPageURL равен "http://www.somesite.com/print.php",, но если в глобальном файле значение $ printPageURL изменяется на" http://www.somesite.com/print.php?newUser=1",, то URL-адрес становится плохо сформированным. Если в проекте 300 файлов и есть 30 файлов, которые добавляют этот параметр таким образом, нам нужно изменить все 30 файлов.

то же самое, если мы добавляем, используя "& mode = 1" и $ printPageURL изменится с "http://www.somesite.com/print.php?new=1" на" http://www.somesite.com/print.php",, тогда URL также будет неправильно сформирован.

есть ли в PHP библиотека, которая будет автоматически обрабатывать "?" и "&", и даже проверяет, что существующий параметр уже существует, и удаляет его, потому что он будет заменен более поздним, и не будет хорошо, если URL будет продолжать расти дольше?

Обновление: из нескольких полезных ответов, похоже, ранее не существовало функции addParam ($ url, $ newParam), поэтому нам не нужно ее писать?

Ответы [ 6 ]

9 голосов
/ 26 мая 2009

Используйте комбинацию parse_url() для разнесения URL, parse_str() для разрыва строки запроса и http_build_query() для перестройки строки запроса. После этого вы можете перестроить весь URL-адрес из его исходных фрагментов, полученных из parse_url(), и новой строки запроса, которую вы создали с помощью http_build_query(). Поскольку строка запроса разбирается в ассоциативный массив (пары ключ-значение), изменить запрос так же просто, как изменить массив в PHP.

EDIT

$query = parse_url('http://www.somesite.com/print.php?mode=1&newUser=1', PHP_URL_QUERY);
// $query = "mode=1&newUser=1"
$params = array();
parse_str($query, $params);
/*
 * $params = array(
 *     'mode'    => '1'
 *     'newUser' => '1'
 * )
 */
unset($params['newUser']);
$params['mode'] = 2;
$params['done'] = 1;
$query = http_build_query($params);
// $query = "mode=2&done=1"
3 голосов
/ 26 мая 2009
2 голосов
/ 26 мая 2009

http://www.addedbytes.com/php/querystring-functions/ это хорошее место для начала

РЕДАКТИРОВАТЬ: Там также http://www.php.net/manual/en/class.httpquerystring.php

например:

$http = new HttpQueryString();
$http->set(array('page' => 1, 'sort' => 'asc')); 
$url = "yourfile.php" . $http->toString();
1 голос
/ 28 октября 2010

Ни одно из этих решений не работает, когда URL имеет вид: xyz.co.uk?param1=2&replace_this_param=2 param1 постоянно сбрасывается .. это означает, что это никогда не работает НИКОГДА!

Если вы посмотрите на код, указанный выше:

function addParam($url, $s) {
    return adjustParam($url, $s);
}

function delParam($url, $s) {
    return adjustParam($url, $s);           
}

Эти функции являются ИДЕНТИЧНЫМИ - так как можно добавить и удалить?!

0 голосов
/ 06 сентября 2010

Вы можете попробовать это:

function removeParamFromUrl($query, $paramToRemove)
{
    $params = parse_url($query);
    if(isset($params['query']))
    {
        $queryParams = array();
        parse_str($params['query'], $queryParams);
        if(isset($queryParams[$paramToRemove])) unset($queryParams[$paramToRemove]);
        $params['query'] = http_build_query($queryParams);
    }
    $ret = $params['scheme'].'://'.$params['host'].$params['path'];
    if(isset($params['query']) && $params['query'] != '' ) $ret .= '?'.$params['query'];
    return $ret;
}
0 голосов
/ 26 мая 2009

, используя предложение WishCow и sgehrig, вот тест:

(при условии отсутствия привязки для URL)

<?php

    echo "<pre>\n";

    function adjustParam($url, $s) {        
        if (preg_match('/(.*?)\?/', $url, $matches)) $urlWithoutParams = $matches[1];
        else $urlWithoutParams = $url;  

        parse_str(parse_url($url, PHP_URL_QUERY), $params);

        if (strpos($s, '=') !== false) {
            list($var, $value) = split('=', $s);
            $params[$var] = urldecode($value);
            return $urlWithoutParams . '?' . http_build_query($params);      
        } else {
            unset($params[$s]);
            $newQueryString = http_build_query($params);
            if ($newQueryString) return $urlWithoutParams . '?' . $newQueryString;      
            else return $urlWithoutParams;
        }

    }

    function addParam($url, $s) {
        return adjustParam($url, $s);
    }

    function delParam($url, $s) {
        return adjustParam($url, $s);       
    }

    echo "trying add:\n";

    echo addParam("http://www.somesite.com/print.php", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?", "mode=3"), "\n"; 
    echo addParam("http://www.somesite.com/print.php?newUser=1", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0&", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?mode=1", "mode=3"), "\n";  

    echo "\n", "now trying delete:\n";

    echo delParam("http://www.somesite.com/print.php?mode=1", "mode"), "\n";   
    echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "mode"), "\n";     
    echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "newUser"), "\n";   

?>

и вывод:

trying add:
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?newUser=1&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?mode=3

now trying delete:
http://www.somesite.com/print.php
http://www.somesite.com/print.php?newUser=1
http://www.somesite.com/print.php?mode=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...