PHP dirname()丢失了最后一个文件夹

时间:2012-08-09 02:59:50

标签: file path explode dirname

问题

这是一个非常容易理解的问题。

我有一位用户提交了一个网址,例如“http://example.com/path/filename.html”。

我正在使用PHP的dirname()函数来获取此URL的所谓“基础”。对于上面的示例,这将是“http://example.com/path”。

当用户输入此内容时,我的问题出现了:

http://example.com/blog

如果您在浏览器中输入上述内容,您将在名为“blog”的文件夹中看到index.php或.html页面。但是,PHP的dirname()将仅返回“http://example.com”。

我不确定它是否认为“博客”是无扩展名的文件,如果存在,但我找不到解决方案。

我尝试过的事情

我首先尝试使用此快速方法获取URL的扩展名:

$url = 'http://example.com/index.php';
$file_extension = end(explode('.', $filename));

然后,我会使用PHP empty()检查扩展名是否存在。如果扩展名存在,则表示在文件夹之后输入了文件名,例如“http://example.com/path/file.html”和dirname()是完美的。如果扩展名不存在,则没有输入文件,路径中的最后一项是文件夹,因此它已经是“基础”。

但是,在简单的“http://example.com/path/”的情况下,上面会返回“.com / path /”作为文件扩展名,我们都知道它不存在。在这种情况下,我会使用dirname()函数并切断“/ path /".

编辑:

basename($url)的扩展名无效,因为如果用户输入“http://example.com”basename()则返回“example.com”,其扩展名为 “.COM”

希望有人遇到同样的问题,并且知道解决方案。我还在寻找,但任何答案都完全赞赏!!

1 个答案:

答案 0 :(得分:1)

修改 好的,在我放弃之前的最后一次:

function getPath($url){
    $parts=explode("/",$url);
    $patharray=array(".","http:","https:");
    if(!in_array(pathinfo($url,PATHINFO_DIRNAME),$patharray) && strpos($parts[count($parts)-1], ".")!==false)
        unset($parts[count($parts)-1]);
    $url=implode("/",$parts);
    if(substr($url,-1)!='/')
        $url.="/";
    return $url;
}
echo getPath("http://www.google.com/blog/testing.php")."\n";
echo getPath("www.google.com/blog/testing.php")."\n";
echo getPath("http://www.google.com/blog/")."\n";
echo getPath("http://www.google.com/blog")."\n";
echo getPath("http://www.google.com")."\n";
echo getPath("http://www.google.com/")."\n";
echo getPath("www.google.com/")."\n";
echo getPath("www.google.com")."\n";

最后一部分有“。”的任何网址。在它解析出来,否则它是独立的。它使用pathinfo()来检查它是否只是一个域名(“google.com”或“http://www.google.com”),然后单独留下最后一部分,因为它会有“。 “在里面。 这是脚本输出:

http://www.google.com/blog/
www.google.com/blog/
http://www.google.com/blog/
http://www.google.com/blog/
http://www.google.com/
http://www.google.com/
www.google.com/
www.google.com/