URL parametrelerini, ekleme, kaldırma veya değiştirme kolları bir PHP kütüphanesi var?

6 Cevap php

biz URL'ye bir param eklediğinizde

$ RedirectURL = $ printPageURL. "Mode = 1";

o $ printPageURL "http://www.somesite.com/print.php" ise çalışır, ancak $ printPageURL küresel dosyasına "http://www.somesite.com/print.php?newUser = değiştirilirse 1 ", daha sonra URL kötü oluşmuş olur. Projenin 300 dosya var ve param bu şekilde eklemek 30 dosyalar varsa, hepimiz 30 dosyalarını değiştirmek gerekir.

Aynı biz "= 1 & modu" kullanılarak append ve $ printPageURL için "http://www.somesite.com/print" http://www.somesite.com/print.php?new=1 "den değiştirirse . php ", daha sonra URL de kötü oluşturulur.

otomatik olarak "?" idare edecek PHP bir kütüphane var Varolan param zaten var ve kaldırılır ve "&", ve hatta kontrol o kimse, daha sonra biri tarafından değiştirilecektir ve URL artık büyüyor devam ediyor eğer iyi değil çünkü?

Update: birkaç yararlı cevapları, bunu yazmak gerekmez, böylece önceden mevcut bir fonksiyonu AddParam ($ url, $ newParam) gibi görünüyor?

6 Cevap

parse_url() to explode the URL, parse_str() to explode the query string and http_build_query() to rebuild the querystring. After that you can rebuild the whole url from its original fragments you get from parse_url() bir arada ve birlikte inşa yeni sorgu dizesi kullanın http_build_query(). QueryString bir ilişkisel dizi (anahtar-değer-çiftleri) içine patladı alır gibi sorgu değiştirerek PHP bir diziyi değiştirmeden kadar kolaydır.

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"

http://www.addedbytes.com/php/querystring-functions/ is a good place to start

DÜZENLEME: Orada da http://www.php.net/manual/en/class.httpquerystring.php

örneğin:

$http = new HttpQueryString();
$http->set(array('page' => 1, 'sort' => 'asc')); 
$url = "yourfile.php" . $http->toString();

None of these solutions work when the url is of the form: xyz.co.uk?param1=2&replace_this_param=2 param1 gets dropped all the time .. which means it never works EVER!

Eğer yukarıda verilen kod bakarsanız:

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

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

Bu işlevler aynıdır - bu yüzden nasıl bir ekleme ve bir silebilirsiniz?!

WishCow ve sgehrig önerisini kullanarak, burada bir test:

(URL için hiçbir çapa varsayarak)

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

?>

ve çıktısı:

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

Bu deneyebilirsiniz:

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