是否有一个PHP库来处理URL参数的添加,删除或替换?

时间:2009-05-26 06:32:29

标签: php url-rewriting

当我们向网址

添加一个参数时

$ redirectURL = $ printPageURL。 “?模式= 1”;

如果$ printPageURL为“http://www.somesite.com/print.php”,则可以正常工作,但如果$ printPageURL在全局文件中更改为“http://www.somesite.com/print.php?newUser=1”,则URL将变得非常糟糕。如果项目有300个文件,并且有30个文件以这种方式附加param,我们需要更改所有30个文件。

如果我们使用“& mode = 1”并且$ printPageURL从“http://www.somesite.com/print.php?new=1”更改为“http://www.somesite.com/print.php”,则相同,那么网址也会形成错误。

PHP中是否有一个库会自动处理“?”和“&”,甚至检查现有的param是否已经存在并删除了那个,因为它将被后者替换,如果URL继续增长则不好?

更新:的几个有用的答案,似乎没有预先存在的函数addParam($ url,$ newParam),所以我们不需要写它?

6 个答案:

答案 0 :(得分:9)

使用parse_url()组合来展开网址,parse_str()分解查询字符串,http_build_query()重新构建查询字符串。之后,您可以从parse_url()获得的原始片段和使用http_build_query()构建的新查询字符串重建整个网址。随着查询字符串被分解为关联数组(键值对),修改查询就像在PHP中修改数组一样简单。

修改

$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"

答案 1 :(得分:3)

答案 2 :(得分:2)

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();

答案 3 :(得分:1)

当网址为以下格式时,这些解决方案都不起作用: 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);           
}

这些功能是IDENTICAL - 那么如何添加和删除?!

答案 4 :(得分:0)

使用WishCow和sgehrig的建议,这是一个测试:

(假设没有网址的锚点)

<?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

答案 5 :(得分:0)

你可以试试这个:

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;
}