Voodoo, я обещал вроде, да и остальным пригодится

antonio

Moderator
Команда форума
Voodoo, я обещал вроде, да и остальным пригодится

Функция для разбора ссылки, даже если часть ссылки отсутствует, например
http://www.ru:80/first.htm
www.ru/first.htm
http://www.ru/a/b/first.htm
/a/b/first.htm
a/b/first.htm

Дело в том, что РНРшная функция parse_url не воркает, если дать неполный урл, например только путь и файл с querystring.

Я затачивал только для http, но ниче не мешает заточить под всевозможные протоколы.

function ParseUrl($url) {
$parsedurl=array("protocol"=>"http","delimiter"=>"://","host"=>"","port"=>"80","path"=>"/","page"=>"","querystring"=>"");
if (ereg("^(http|HTTP|Http)?:)//)?(([a-zA-Z0-9_-]+\.)+[a-zA-Z0-9_-]+)?:?([0-9]+)?(/?[a-zA-Z0-9_\./-]+/)?([a-zA-Z0-9\._-]+)?\??(.+)?$",$url,&$data)) {
if (strlen($data[1]))
$parsedurl["protocol"]=$data[1];
if (strlen($data[2]))
$parsedurl["delimiter"]=$data[2];
if (strlen($data[3]))
$parsedurl["host"]=$data[3];
if (strlen($data[5]))
$parsedurl["port"]=$data[5];
if (strlen($data[6]))
$parsedurl["path"]=$data[6];
if (strlen($data[7]))
$parsedurl["page"]=$data[7];
if (strlen($data[8]))
$parsedurl["querystring"]=$data[8];
}
return $parsedurl;
}

Пример:

$parsed_url=ParseUrl("http://www.myhost.ru:123/qq/bb/p.htm?c=1&b=2");
$keys=array_keys($parsed_url);
for ($i=0;$i<sizeof($keys);$i++)
print $keys[$i]."=".$parsed_url[$keys[$i]]."
";

function ImplodeUrl($parsedurl) {
$url=$parsedurl["protocol"].$parsedurl["delimiter"].$parsedurl["host"];
if (strlen($parsedurl["port"]))
$url.=":".$parsedurl["port"];
if ($parsedurl["path"][0]!="/")
$url.="/";
$url.=$parsedurl["path"];
if (strlen($parsedurl["page"]))
$url.=$parsedurl["page"];
if (strlen($parsedurl["querystring"]))
$url.="?".$parsedurl["querystring"];
return($url);
}

print "И обратная сборка: ".ImplodeUrl($parsed_url);
 
Сверху