php parse_url reverse – проанализированный URL-адрес

Есть ли способ обратить вспять URL из проанализированного URL-адреса?

$url = 'http://www.domain.com/dir/index.php?query=blabla#more_bla'; $parse = parse_url($url); print_r($parse); /* array( 'scheme'=>'http://', etc.... ) */ $revere = reverse_url($parse); // probably does not exist but u get the point echo $reverse; //outputs:// "http://www.domain.com/dir/index.php?query=blabla#more_bla" 

Или, если есть способ проверить URL-адрес, который не содержит части рекомендуемых URL-адресов, например

www.mydomain.com

mydomain.com

должны все вернуть http://www.mydomain.com или с правильным поддоменом

    Вы должны быть в состоянии сделать

     http_build_url($parse) 

    Согласно документам, он разработан специально для обработки вывода из parse_url . Обе функции обрабатывают анкеры, параметры запроса и т. Д., Поэтому нет «других свойств, не упомянутых в $ url».

    Чтобы добавить http:// когда он отсутствует, используйте базовую проверку перед ее разбором:

     if (strpos($url, "http://") != 0) $url = "http://$url"; 

    Это две функции, которые я использую для разложения и восстановления URL-адресов:

     function http_parse_query($query) { $parameters = array(); $queryParts = explode('&', $query); foreach ($queryParts as $queryPart) { $keyValue = explode('=', $queryPart, 2); $parameters[$keyValue[0]] = $keyValue[1]; } return $parameters; } function build_url(array $parts) { return (isset($parts['scheme']) ? "{$parts['scheme']}:" : '') . ((isset($parts['user']) || isset($parts['host'])) ? '//' : '') . (isset($parts['user']) ? "{$parts['user']}" : '') . (isset($parts['pass']) ? ":{$parts['pass']}" : '') . (isset($parts['user']) ? '@' : '') . (isset($parts['host']) ? "{$parts['host']}" : '') . (isset($parts['port']) ? ":{$parts['port']}" : '') . (isset($parts['path']) ? "{$parts['path']}" : '') . (isset($parts['query']) ? "?{$parts['query']}" : '') . (isset($parts['fragment']) ? "#{$parts['fragment']}" : ''); } // Example $parts = parse_url($url); if (isset($parts['query'])) { $parameters = http_parse_query($parts['query']); foreach ($parameters as $key => $value) { $parameters[$key] = $value; // do stuff with $value } $parts['query'] = http_build_query($parameters); } $url = build_url($parts); 

    Эта функция должна сделать трюк:

     /** * @param array $parsed * @return string */ function unparse_url(array $parsed) { $get = function ($key) use ($parsed) { return isset($parsed[$key]) ? $parsed[$key] : null; }; $pass = $get('pass'); $user = $get('user'); $userinfo = $pass !== null ? "$user:$pass" : $user; $port = $get('port'); $scheme = $get('scheme'); $query = $get('query'); $fragment = $get('fragment'); $authority = ($userinfo !== null ? "$userinfo@" : '') . $get('host') . ($port ? ":$port" : ''); return (strlen($scheme) ? "$scheme:" : '') . (strlen($authority) ? "//$authority" : '') . $get('path') . (strlen($query) ? "?$query" : '') . (strlen($fragment) ? "#$fragment" : ''); } 

    Вот краткий тест:

     function unparse_url_test() { foreach ([ '', 'foo', 'http://www.google.com/', 'http://u:p@foo:1/path/path?q#frag', 'http://u:p@foo:1/path/path?#', 'ssh://root@host', '://:@:1/?#', 'http://:@foo:1/path/path?#', 'http://@foo:1/path/path?#', ] as $url) { $parsed1 = parse_url($url); $parsed2 = parse_url(unparse_url($parsed1)); if ($parsed1 !== $parsed2) { print var_export($parsed1, true) . "\n!==\n" . var_export($parsed2, true) . "\n\n"; } } } unparse_url_test(); 

    Другая реализация:

     function build_url(array $elements) { $e = $elements; return (isset($e['host']) ? ( (isset($e['scheme']) ? "$e[scheme]://" : '//') . (isset($e['user']) ? $e['user'] . (isset($e['pass']) ? ":$e[pass]" : '') . '@' : '') . $e['host'] . (isset($e['port']) ? ":$e[port]" : '') ) : '') . (isset($e['path']) ? $e['path'] : '/') . (isset($e['query']) ? '?' . (is_array($e['query']) ? http_build_query($e['query'], '', '&') : $e['query']) : '') . (isset($e['fragment']) ? "#$e[fragment]" : '') ; } 

    Результаты должны быть следующими:

     { "host": "example.com" } /* //example.com/ */ { "scheme": "https", "host": "example.com" } /* https://example.com/ */ { "scheme": "http", "host": "example.com", "port": 8080, "path": "/x/y/z" } /* http://example.com:8080/x/y/z */ { "scheme": "http", "host": "example.com", "port": 8080, "user": "anonymous", "query": "a=b&c=d", "fragment": "xyz" } /* http://anonymous@example.com:8080/?a=b&c=d#xyz */ { "scheme": "http", "host": "example.com", "user": "root", "pass": "stupid", "path": "/x/y/z", "query": { "a": "b", "c": "d" } } /* http://root:stupid@example.com/x/y/z?a=b&c=d */ { "path": "/x/y/z", "query": "a=b&c=d" } /* /x/y/z?a=b&c=d */ 

    Получить последнюю строку из URL-адреса, например: http://example.com/controllername/functionname, и получить имя функции

    $ referer = explode ('/', strrev ($ _ SERVER ['HTTP_REFERER']));

    $ lastString = strrev ($ referer [0]);