代码之家  ›  专栏  ›  技术社区  ›  Cam

如何在PHP中组合查询字符串

  •  2
  • Cam  · 技术社区  · 14 年前

    给定一个URL和一个查询字符串,如何获取查询字符串与URL组合后得到的URL?

    我在寻找类似于.htaccess的功能 qsa . 我意识到完全手工实现这一点非常简单,但是是否有内置函数可以处理查询字符串,这些字符串可以简化或完全解决这一问题?

    示例输入/结果集:

    Url="http://www.example.com/index.php/page?a=1"
    QS ="?b=2"
    Result="http://www.example.com/index.php/page?a=1&b=2"
    

    -

    Url="page.php"
    QS ="?b=2"
    Result="page.php?b=2"
    
    5 回复  |  直到 9 年前
        1
  •  7
  •   Fluffy    9 年前

    如果没有使用pecl扩展,并且不是一组庞大的复制和粘贴函数,那该怎么办?它仍然有点复杂,因为您要将两个查询字符串拼接在一起,并希望以一种不仅仅是 $old .= $new;

    我们将使用 parse_url 要从所需的URL中提取查询字符串, parse_str 要分析要加入的查询字符串, array_merge 把他们连在一起,和 http_build_query 为我们创建新的组合字符串。

    // Parse the URL into components
    $url = 'http://...';
    $url_parsed = parse_url($url);
    $new_qs_parsed = array();
    // Grab our first query string
    parse_str($url_parsed['query'], $new_qs_parsed);
    // Here's the other query string
    $other_query_string = 'that=this&those=these';
    $other_qs_parsed = array();
    parse_str($other_query_string, $other_qs_parsed);
    // Stitch the two query strings together
    $final_query_string_array = array_merge($new_qs_parsed, $other_qs_parsed);
    $final_query_string = http_build_query($final_query_string_array);
    // Now, our final URL:
    $new_url = $url_parsed['scheme'] 
             . '://'
             . $url_parsed['host'] 
             . $url_parsed['path'] 
             . '?'      
             . $final_query_string;
    
        2
  •  1
  •   Sarfraz    14 年前

    您可以使用以下方法从URL获取查询字符串部分:

    $_SERVER['QUERY_STRING']
    

    然后将其正常附加到URL。

    如果要在查询字符串中指定自己的自定义变量,请查看:

    http_build_query

        3
  •  0
  •   Kerry Jones    14 年前

    这是从WordPress“框架”中提取的一系列函数,可以做到这一点,但这可能太多了:

    AddiQuyRayAg()

    /**
     * Retrieve a modified URL query string.
     *
     * You can rebuild the URL and append a new query variable to the URL query by
     * using this function. You can also retrieve the full URL with query data.
     *
     * Adding a single key & value or an associative array. Setting a key value to
     * emptystring removes the key. Omitting oldquery_or_uri uses the $_SERVER
     * value.
     *
     * @since 1.0
     *
     * @param mixed $param1 Either newkey or an associative_array
     * @param mixed $param2 Either newvalue or oldquery or uri
     * @param mixed $param3 Optional. Old query or uri
     * @return string New URL query string.
     */
    public function add_query_arg() {
        $ret = '';
        if ( is_array( func_get_arg(0) ) ) {
            $uri = ( @func_num_args() < 2 || false === @func_get_arg( 1 ) ) ? $_SERVER['REQUEST_URI'] : @func_get_arg( 1 );
        } else {
            $uri = ( @func_num_args() < 3 || false === @func_get_arg( 2 ) ) ? $_SERVER['REQUEST_URI'] : @func_get_arg( 2 );
        }
    
        if ( $frag = strstr( $uri, '#' ) ) {
            $uri = substr( $uri, 0, -strlen( $frag ) );
        } else {
            $frag = '';
        }
    
        if ( preg_match( '|^https?://|i', $uri, $matches ) ) {
            $protocol = $matches[0];
            $uri = substr( $uri, strlen( $protocol ) );
        } else {
            $protocol = '';
        }
    
        if ( strpos( $uri, '?' ) !== false ) {
            $parts = explode( '?', $uri, 2 );
            if ( 1 == count( $parts ) ) {
                $base = '?';
                $query = $parts[0];
            } else {
                $base = $parts[0] . '?';
                $query = $parts[1];
            }
        } elseif ( !empty( $protocol ) || strpos( $uri, '=' ) === false ) {
            $base = $uri . '?';
            $query = '';
        } else {
            $base = '';
            $query = $uri;
        }
    
        parse_str( $query, $qs );
    
        if ( get_magic_quotes_gpc() )
            $qs = format::stripslashes_deep( $qs );
    
        $qs = format::urlencode_deep( $qs ); // this re-URL-encodes things that were already in the query string
        if ( is_array( func_get_arg( 0 ) ) ) {
            $kayvees = func_get_arg( 0 );
            $qs = array_merge( $qs, $kayvees );
        } else {
            $qs[func_get_arg( 0 )] = func_get_arg( 1 );
        }
    
        foreach ( ( array ) $qs as $k => $v ) {
            if ( $v === false )
                unset( $qs[$k] );
        }
    
        $ret = http_build_query( $qs, '', '&' );
        $ret = trim( $ret, '?' );
        $ret = preg_replace( '#=(&|$)#', '$1', $ret );
        $ret = $protocol . $base . $ret . $frag;
        $ret = rtrim( $ret, '?' );
        return $ret;
    }
    

    条纹斜线

    /**
     * Navigates through an array and removes slashes from the values.
     *
     * If an array is passed, the array_map() function causes a callback to pass the
     * value back to the function. The slashes from this value will removed.
     *
     * @since 1.0
     *
     * @param array|string $value The array or string to be stripped
     * @return array|string Stripped array (or string in the callback).
     */
    function stripslashes_deep( $value ) {
        return is_array( $value ) ? array_map( array('self', 'stripslashes_deep'), $value ) : stripslashes( $value );
    }
    

    乌伦代码_deep()

    /**
     * Navigates through an array and encodes the values to be used in a URL.
     *
     * Uses a callback to pass the value of the array back to the function as a
     * string.
     *
     * @since 1.0
     *
     * @param array|string $value The array or string to be encoded.
     * @return array|string $value The encoded array (or string from the callback).
     */
    public function urlencode_deep( $value ) {
        return is_array($value) ? array_map( array('self', 'urlencode_deep'), $value) : urlencode($value);
    }
    
        4
  •  0
  •   ZZ Coder    14 年前

    没有内置功能来完成此操作。但是,可以从HTTP PECL扩展使用此函数,

    http://usphp.com/manual/en/function.http-build-url.php

    例如,

    $url = http_build_url("http://www.example.com/index.php/page?a=1",
        array(
            "b" => "2"
        )
    );
    
        5
  •  0
  •   artlung    14 年前

    那么如果URL冲突会发生什么呢?如果两个URL都包含 b= querystring中的组件?你得决定谁会占主导地位。

    这里有一段代码可以满足您的需要,将每个字符串解析为一个URL,然后提取 query URL部分和 implode() 把他们放回一起。

    $url="http://www.example.com/index.php/page?a=1";
    $qs ="?b=2";
    
    $url_parsed = parse_url($url);
    $qs_parsed = parse_url($qs);
    
    $args = array(
        $url_parsed['query'],
        $qs_parsed['query'],
    );
    
    $new_url = $url_parsed['scheme'];
    $new_url .= '://';
    $new_url .= $url_parsed['host'];
    $new_url .= $url_parsed['path'];
    $new_url .= '?';
    $new_url .= implode('&', $args);
    
    print $new_url;