Make a local link global /test.php -> example.com/test.ph


Make a local link global /test.php -> example.com/test.php

我一直在研究蜘蛛算法,一直有一些问题与链接。

如何工作的例子:

从->example.com/bob/index.php ?页面=有趣+面临

内容为:

<html>
<a href="../jack/index.php"> link 1 </a>
<a href="/bob_more_info"> link 2 </a>
<a href="http://www.youtube.com"> link 3 </a>
</html>

通过get links函数传递内容

链接函数返回

[0] = ./jack/index.php

[1] =/bob_more_info

[2] = http://www.youtube.com

现在我需要让这些链接url的页面我得到他们(example.com/bob/index.php?page=funny+faces)

[0]→../jack/index.php into example.com/jack/index.php

[1]→/bob_more_infointo example.com/bob/bob_more_info

[2]→http://www.youtube.com

我要求的是一个可以进行转换的函数。这是我的,但它并不总是有效,而且正在成为一种痛苦。如果你能编辑它或给我写一个函数,我将不胜感激。提前谢谢。

下面是我当前的功能:

//example:
//$newURL = URLfix("example.com/bob/index.php?page=funny+faces", "../jack/index.php");
function URLfix ($url, $ext)
{
    if(is_valid_url($url."/"))
    {
        $url .= "/";
    }
    $ar1 = explode("/", $url);
    if(count($ar1) == 1)
    {
        return $url."/".$ext;
    }
    $target = $ar1[count($ar1) - 1];
    if($target == "")
    {
        return $url.$ext;
    }
    if(strpos(" ".$target, "."))
    {
        $cur = "";
        for($i = 0; $i < count($ar1) - 1; $i ++)
        {
            $cur .= $ar1[$i];
        $cur .= "/";
        }
        return $cur.$ext;
    }
    return $url."/".$ext;
}

使用explosion()将$url分割成一个以/分隔的数组,那么$bits[0]例如将包含example.com

since

example.com/jack/index.php

等价于:

example.com/bob/../jack/index.php

我不担心那部分。对于url,我将首先删除查询字符串,然后弹出最后一段以获得基本url:

list($url, $query_string = explode("?", $url);
$segments = explode("/", $url);
array_pop($segments);
$base_url = implode("/", $segments);

请务必添加一些错误检查

存在一个规范,它一步一步地解释了如何将相对URI解析为它的基本URI。RFC 3986:

  • 你们所说的"全局链接"就是URI引用
  • 你所说的"本地链接";命名为相对参考

每个相对引用都有一个它所引用的基引用。基引用是一个URI引用。您可以从任何基本URI引用和相对引用中解析新的URI引用。此过程称为相对分辨率

PHP代码,可以在Net_URL2 PEAR Package中找到,它有一个如何使用此查找->resolve()的示例。