[php] GET 매개 변수를 추가하여 URL 문자열 조작

반복하지 않고 GET 매개 변수를 포함 ?하거나 포함하지 않을 수있는 URL에 GET 매개 변수를 추가하고 싶습니다 &.

예:

추가하려면 category=action

$url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

발견되면 물음표를 반복하지 않으려 고합니다.

URL은 문자열입니다.

특정 GET 매개 변수를 추가하는 신뢰할 수있는 방법은 무엇입니까?



답변

기본 방법

$query = parse_url($url, PHP_URL_QUERY);

// Returns a string if the URL has parameters or NULL if not
if ($query) {
    $url .= '&category=1';
} else {
    $url .= '?category=1';
}

더 고급

$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';

$url_parts = parse_url($url);
// If URL doesn't have a query string.
if (isset($url_parts['query'])) { // Avoid 'Undefined index: query'
    parse_str($url_parts['query'], $params);
} else {
    $params = array();
}

$params['category'] = 2;     // Overwrite if exists
$params['tags'][] = 'cool';  // Allows multiple values

// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);

// If you have pecl_http
echo http_build_url($url_parts);

// If not
echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query'];

클래스가 아니라면 적어도 함수에 넣어야합니다.


답변

다음은 허용되는 답변의 짧은 버전입니다.

$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';

편집 : 수락 된 답변에서 논의했듯이 category이미 존재 하는지 확인하지 않는다는 결함이 있습니다. 더 나은 해결책은를 $_GET배열 로 처리하고 같은 함수를 사용하는 것 in_array()입니다.


답변

$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

$queryString =  http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor

echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor


답변

strpos 를 사용 하여?를 감지 하십시오 . 이후? 쿼리 문자열의 시작 부분에있는 URL에만 나타날 수 있습니다. 이미 매개 변수가 있는지 확인하고 &를 사용하여 매개 변수를 추가해야합니다.

function addGetParamToUrl(&$url, $varName, $value)
{
    // is there already an ?
    if (strpos($url, "?"))
    {
        $url .= "&" . $varName . "=" . $value;
    }
    else
    {
        $url .= "?" . $varName . "=" . $value;
    }
}


답변

이 함수는 기존 인수를 덮어 씁니다.

function addToURL( $key, $value, $url) {
    $info = parse_url( $url );
    parse_str( $info['query'], $query );
    return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}


답변

기존 매개 변수를 업데이트하는 예.

또한 url_encode가 사용되었으며 매개 변수 값을 지정하지 않을 가능성도 있습니다.

    <?
    /**
     * Add parameter to URL
     * @param string $url
     * @param string $key
     * @param string $value
     * @return string result URL
     */
    function addToUrl($url, $key, $value = null) {
        $query = parse_url($url, PHP_URL_QUERY);
        if ($query) {
            parse_str($query, $queryParams);
            $queryParams[$key] = $value;
            $url = str_replace("?$query", '?' . http_build_query($queryParams), $url);
        } else {
            $url .= '?' . urlencode($key) . '=' . urlencode($value);
        }
        return $url;
    }


답변

<?php
$url1 = '/test?a=4&b=3';
$url2 = 'www.baidu.com/test?a=4&b=3&try_count=1';
$url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2';
$url4 = '/test';
function add_or_update_params($url,$key,$value){
    $a = parse_url($url);
    $query = $a['query'] ? $a['query'] : '';
    parse_str($query,$params);
    $params[$key] = $value;
    $query = http_build_query($params);
    $result = '';
    if($a['scheme']){
        $result .= $a['scheme'] . ':';
    }
    if($a['host']){
        $result .= '//' . $a['host'];
    }
    if($a['path']){
        $result .=  $a['path'];
    }
    if($query){
        $result .=  '?' . $query;
    }
    return $result;
}
echo add_or_update_params($url1,'try_count',1);
echo "\n";
echo add_or_update_params($url2,'try_count',2);
echo "\n";
echo add_or_update_params($url3,'try_count',3);
echo "\n";
echo add_or_update_params($url4,'try_count',4);
echo "\n";