【问题标题】:How do I get the depth of a URL using PHP?如何使用 PHP 获取 URL 的深度?
【发布时间】:2017-10-12 04:58:00
【问题描述】:

我想使用 PHP 回显当前页面 URL 的深度(或我家的目录数量)。我该怎么做?

例如,如果我在 mysite.com,输出显示“0”,如果我在 mysite.com/recipes,输出显示“1”,如果我在 mysite.com/食谱/馅饼,输出显示“2”,依此类推。

我该怎么做?

我尝试简化它并执行此操作,但它导出为 0:

$folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");
echo $folder_depth;

【问题讨论】:

  • /? 之前的计数?

标签: php url path


【解决方案1】:

如果您没有查询字符串,则可以在 / 上展开。如果您将有一个查询字符串,则需要先将其删除,例如...

$url = preg_replace('/?.*$/','',$url);

如果您的 URL 前面有 http:// 或 https://,那也可能会搞砸。所以删除它...

$url = preg_replace('~^https*://~','',$url);

现在,您的网址只有 example.com/some/path/to/something。您可以在 / 上爆炸并获得计数:

$a = explode('/',$url);

$a 的大小将比你想要的多 1。所以,你需要减去一个:

$depth = sizeof($a)-1;

新问题...我只是计算了文件本身,例如example.com/links.html 会出现1,而不仅仅是0。所以,在爆炸之前我需要去掉文件名。但是......我怎么知道它是文件还是目录?这不是内置在 URL 规范中的。例如,example.com/test 可以是一个文件,也可以是一个目录(然后它会自动转到 example.com/test/index.html)。您需要假设您将拥有哪些文件扩展名并在分解之前删除这些文件,例如:

$url = preg_replace('~/[^/]+.(html|php|gig|png|mp3)$~','',$url);

【讨论】:

  • 您不能也使用parse_url() 并在路径上进行数学运算吗?
  • @JayBlanchard 是的,如果你想在没有任何正则表达式乐趣的情况下以无聊的方式来做的话。
  • ¯\_(ツ)_/¯ 呵呵!
【解决方案2】:

只是为了好玩,这是我使用 PHP 的 parse_url() 及其 PHP_URL_PATH 返回值以及其他几个函数的廉价而俗气的解决方案:

$url = 'http://universeofscifi.com/content/tagged/model/battlestar_galactica.html';
echo var_dump(parse_url($url, PHP_URL_PATH));
echo count(explode('/', (parse_url($url, PHP_URL_PATH)))) - 2;

这会返回:

string(47) "/content/tagged/model/battlestar_galactica.html"
3

我从计数中减去 2 以丢弃前面的域和末尾的文件,只留下目录深度计数。

【讨论】:

    【解决方案3】:

    @kainaw,我喜欢你的回答!谢谢!

    我对此有所了解。首先,我注意到我使用了错误的 PHP 函数来获取我需要的部分 URL。其次,我需要使用@kaniaw 的示例并获取我应该计算的 URL 部分,而忽略其他部分。

    我还必须考虑在“/”之间没有内容的 url,所以像 /word//// 这样的东西仍然算作 1。因此,我只计算了 explode() 之后不为空的数组元素。

    这是我的代码:

    $url = $_SERVER['REQUEST_URI'];
    //echo "*".$_SERVER['REQUEST_URI']."*";
    //$url = preg_replace('/?.*$/','',$url);
    //$url = preg_replace('~^https*://~','',$url);
    //$url = preg_replace('~/[^/]+.(html|php|gig|png|mp3)$~','',$url);
    $a = explode('/',$url);
    
    $depth =count(array_filter($a));
    echo $depth;
    

    我注释掉了其中一些行,因为我没有看到它们,但它们在上面提到了。

    谢谢!

    【讨论】:

    • 你可以使用 $url=preg_replace('~/+~','/',$url);用单个 / 替换 /////。它用一个 / 替换任何多个 / 的运行。
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多