Skip to content

Instantly share code, notes, and snippets.

@anjan011
Last active December 7, 2017 06:55
Show Gist options
  • Save anjan011/08df8c9f6b1051b5124e01ca5d131957 to your computer and use it in GitHub Desktop.
Save anjan011/08df8c9f6b1051b5124e01ca5d131957 to your computer and use it in GitHub Desktop.
Generates an url
<?php
/**
* Generates an url
*
* @param array $params List of params
*
* @internal string $params['baseUrl'] The base url, default: $_SERVER['REQUEST_URI']
* @internal array $params['queryAdd'] Adds extra query params as associative array
* @internal array $params['queryRemove'] Removes query parameters as simple array
* @internal bool $params['forceAbsolute'] Forces the generated url to be an absolute url based on the current domain
*
* @return null|string
*/
public function generateUrl( $params = array() ) {
$params = is_array( $params ) ? $params : array();
$forceAbsolute = isset( $params[ 'forceAbsolute' ] ) && $params[ 'forceAbsolute' ];
$baseUrl = isset( $params[ 'baseUrl' ] ) ? trim( $params[ 'baseUrl' ] ) : '';
if ( !$baseUrl ) {
$baseUrl = $_SERVER[ 'REQUEST_URI' ];
}
$baseUrl = rawurldecode( $baseUrl );
$urlParts = parse_url( $baseUrl );
if ( !$urlParts ) {
return NULL;
}
$scheme = isset( $urlParts[ 'scheme' ] ) ? trim( $urlParts[ 'scheme' ] ) : '';
if ( $forceAbsolute && !$scheme ) {
$scheme = 'http';
if ( isset( $_SERVER[ 'HTTPS' ] ) && $_SERVER[ 'HTTPS' ] !== 'off' ) {
$scheme .= 's';
}
}
$host = isset( $urlParts[ 'host' ] ) ? trim( $urlParts[ 'host' ] ) : '';
if ( $forceAbsolute && !$host ) {
$host = $_SERVER[ 'SERVER_NAME' ];
}
$port = isset( $urlParts[ 'port' ] ) ? trim( $urlParts[ 'port' ] ) : '';
$path = isset( $urlParts[ 'path' ] ) ? trim( $urlParts[ 'path' ] ) : '';
$query = isset( $urlParts[ 'query' ] ) ? trim( $urlParts[ 'query' ] ) : '';
$fragment = isset( $urlParts[ 'fragment' ] ) ? trim( $urlParts[ 'fragment' ] ) : '';
$user = isset( $urlParts[ 'user' ] ) ? trim( $urlParts[ 'user' ] ) : '';
$pass = isset( $urlParts[ 'pass' ] ) ? trim( $urlParts[ 'pass' ] ) : '';
$url = '';
# scheme
if ( !$scheme ) {
if ( $host ) {
$url .= '//';
}
}
else {
$url .= $scheme.'://';
}
# host
if ( $host ) {
# user and pass
$auth = '';
if ( $user ) {
$auth .= $user;
}
if ( $pass ) {
$auth .= ':'.$pass;
}
if ( $auth ) {
$url .= $auth.'@';
}
# the host ...
$url .= $host;
# port
if ( $port ) {
$port = (int) $port;
if ( $port != 80 && $port != 443 ) {
$url .= ':'.$port;
}
}
}
# path
if ( $path ) {
if ( $forceAbsolute ) {
if ( stripos( $path, '/' ) !== 0 ) {
$path = '/'.$path;
}
}
$url .= $path;
}
# query
$queryArray = array();
if ( $query ) {
parse_str( $query, $queryArray );
}
$queryAdd = isset( $params[ 'queryAdd' ] ) && is_array( $params[ 'queryAdd' ] ) ? $params[ 'queryAdd' ] : array();
if ( !empty( $queryAdd ) ) {
foreach ( $queryAdd as $k => $v ) {
$queryArray[ $k ] = $v;
}
}
$queryRemove = isset( $params[ 'queryRemove' ] ) && is_array( $params[ 'queryRemove' ] ) ? $params[ 'queryRemove' ] : array();
if ( !empty( $queryRemove ) ) {
foreach ( $queryRemove as $k ) {
unset( $queryArray[ $k ] );
}
}
if ( !empty( $queryArray ) ) {
$url .= "?".http_build_query( $queryArray );
}
# fragment
if ( $fragment ) {
$url .= '#'.$fragment;
}
return $url;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment