[a-z][a-z0-9\+\-\.]*):/* # scheme (?:(?P[^:@]*)(?::(?P[^@]*))?@)? # user and password (?P[^/\?\#:]*) # host (?::(?P[0-9]+))? # port (?P[^\?\#]*) # path (?:\?(?P[^\#]*))? # query (?:\#(?P.*))? # fragment $!ix'; $path_rx = '!^ (?P[^\?\#]*) # path (same as above) (?:\?(?P[^\#]*))? # query (same as above) (?:\#(?P.*))? # fragment (same as above) $!ix'; if (!preg_match($full_rx, $url, $m)) { preg_match($path_rx, $url, $m); } $return = array( 'scheme' => isset($m['scheme']) ? $m['scheme'] : NULL, 'user' => isset($m['user']) ? $m['user'] : NULL, 'pass' => isset($m['pass']) ? $m['pass'] : NULL, 'host' => isset($m['host']) ? $m['host'] : NULL, 'port' => isset($m['port']) ? $m['port'] : NULL, 'path' => isset($m['path']) ? $m['path'] : '', 'query' => isset($m['query']) ? $m['query'] : '', 'fragment' => isset($m['fragment']) ? $m['fragment'] : '', ); switch ($component) { case NULL: return $return; case PHP_URL_SCHEME: return $return['scheme']; case PHP_URL_HOST: return $return['host']; case PHP_URL_PORT: return $return['port']; case PHP_URL_USER: return $return['user']; case PHP_URL_PASS: return $return['pass']; case PHP_URL_PATH: return $return['path']; case PHP_URL_QUERY: return $return['query']; case PHP_URL_FRAGMENT: return $return['fragment']; } }