【问题标题】:How to get URL relative "deepness"?如何获得 URL 相对“深度”?
【发布时间】:2011-02-16 00:47:47
【问题描述】:

在 PHP 中,如何根据我所在的位置获取 URL 相关指标?例子:

Location                 Return

example.com              ./
example.com/sub          ../
example.com/sub/sub      ../../

...

【问题讨论】:

  • 我能问一下你想要的原因吗?
  • 我使用包含 PHP 的头文件,它必须引用顶级样式表和顶级菜单,但不会消除实际页面使用相对链接的可能性,因此不使用基本 href。
  • 绝对路径可以让你的代码更好,结合环境常量,例如define('BASE_URL', 'http://example.com/') 并且仍然允许您使用 relative。

标签: php url relative-path


【解决方案1】:

考虑到你上面的例子:

$url = 'example.com/sub/sub/';
$parts = explode('/', $url);
$parts = array_filter($parts, 'strlen');
$path = count($parts) == 1 ? './' : str_repeat('../', count($parts)-1);

此代码忽略空白部分和尾部斜杠(例如:example.com//sub/)。

【讨论】:

  • 更好。安全多了。谢谢:)
  • @Lazlo:不。您可以让parse_url 仅返回路径元素(例如:/sub/sub),但您仍然需要计算斜线并自己删除空部分/尾随斜线。
【解决方案2】:

不只是计算 url 中的斜杠数量就足够了。你可以使用preg_match_all

<?php
preg_match_all('/\//',$url,$matches);
echo count($matches);
?>

(未经测试的代码)

【讨论】:

  • 不使用正则表达式。 substr_count($url, '/');
【解决方案3】:

嗯,快速猜测:

function getDeepness($url){
  $lvls = substr_count($url, '/');

  if(!$lvls){
    return "./";
  }

  return str_repeat("../", $lvls);
}

【讨论】:

  • 很公平,但安全性如何?是否存在可能失败的情况?
  • 问题是——你想在哪里使用它?我建议使用绝对路径 - 少麻烦,看起来也不那么难看。定义一个根路径的常量,然后附加工作目录路径。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多