* $str = 'foo[]=bar&openid.nonce=123456';
*
* parse_str( $str, $params );
* $params = ezcUrlTools::parseQueryString( $str );
*
*
* In the first case (parse_str()), $params will be:
*
* array( 'foo' => array( 'bar' ), 'openid_nonce' => '123456' );
*
*
* In the second case (ezcUrlTools::parseQueryString()), $params will be:
*
* array( 'foo' => array( 'bar' ), 'openid.nonce' => '123456' );
*
*
* @param array(string=>mixed) $str The string to parse
* @return array(string=>mixed)
*/
public static function parseQueryString( $str )
{
$result = array();
// $params will be returned, but first we have to ensure that the dots
// are not converted to underscores
parse_str( $str, $params );
$separator = ini_get( 'arg_separator.input' );
if ( empty( $separator ) )
{
$separator = '&';
}
// go through $params and ensure that the dots are not converted to underscores
$args = explode( $separator, $str );
foreach ( $args as $arg )
{
$parts = explode( '=', $arg, 2 );
if ( !isset( $parts[1] ) )
{
$parts[1] = null;
}
if ( substr_count( $parts[0], '[' ) === 0 )
{
$key = $parts[0];
}
else
{
$key = substr( $parts[0], 0, strpos( $parts[0], '[' ) );
}
$paramKey = str_replace( '.', '_', $key );
if ( isset( $params[$paramKey] ) && strpos( $paramKey, '_' ) !== false )
{
$newKey = '';
for ( $i = 0; $i < strlen( $paramKey ); $i++ )
{
$newKey .= ( $paramKey{$i} === '_' && $key{$i} === '.' ) ? '.' : $paramKey{$i};
}
$keys = array_keys( $params );
if ( ( $pos = array_search( $paramKey, $keys ) ) !== false )
{
$keys[$pos] = $newKey;
}
$values = array_values( $params );
$params = array_combine( $keys, $values );
}
}
return $params;
}
/**
* Returns the current URL as a string from the array $source
* (by default $_SERVER).
*
* The following fields are used in building the URL:
* - HTTPS - determines the scheme ('http' or 'https'). 'https' only if
* the 'HTTPS' field is set or if it is 'on' or '1'
* - SERVER_NAME
* - SERVER_PORT - determines if port is default (80 = do not include port)
* or not default (other than 80 = include port)
* - REQUEST_URI
*
* For example, if $_SERVER has these fields:
*
* $_SERVER = array(
* 'HTTPS' => '1',
* 'SERVER_NAME' => 'www.example.com',
* 'SERVER_PORT' => 80,
* 'REQUEST_URI' => '/index.php'
* );
*
*
* Then by calling this function (with no parameters), this URL will be
* returned: 'http://www.example.com/index.php'.
*
* The source of the URL parts can be changed to be other than $_SERVER by
* specifying an array parameter when calling this function.
*
* @todo check if REQUEST_URI works in Windows + IIS.
* - Use PHP_SELF instead?
* - Or use SCRIPT_NAME + QUERY_STRING?
* - Or even use an ISAPI filter?
* @todo check for proxy servers
* - Use $_SERVER['HTTP_X_FORWARDED_SERVER']?
*
* @param array(string=>mixed) $source The default array source, default $_SERVER
* @return string
*/
public static function getCurrentUrl( array $source = null )
{
if ( $source === null )
{
$source = $_SERVER;
}
$url = '';
if ( isset( $source['HTTPS'] ) &&
( strtolower( $source['HTTPS'] ) === 'on' || $source['HTTPS'] === '1' ) )
{
$url .= 'https://';
}
else
{
$url .= 'http://';
}
$url .= isset( $source['SERVER_NAME'] ) ? $source['SERVER_NAME'] : null;
if ( isset( $source['SERVER_PORT'] ) && $source['SERVER_PORT'] != 80 )
{
$url .= ":{$source['SERVER_PORT']}";
}
$url .= isset( $source['REQUEST_URI'] ) ? $source['REQUEST_URI'] : null;
return $url;
}
}
?>