【问题标题】:php get level of urlphp获取url的级别
【发布时间】:2011-02-10 23:47:07
【问题描述】:

我是一个完整的 PHP 新手,我只是在 Drupal 中做一些主题。只是想知道这是否可能:

例如

http://xxxxxxxxxx.com/conference-events,给出:

<body id="conference-events" class="level1">

http://xxxxxxxxxx.com/conference-events/rooms-capacities,给出:

<body id="conference-events" class="rooms-capacities level2">

http://xxxxxxxxxx.com/conference-events/rooms-capacities/bob,给出:

<body id="conference-events" class="bob level3">

基本上我有ID/头等舱的代码,但是用php能抢到关卡吗?

一个。

【问题讨论】:

    标签: php drupal themes


    【解决方案1】:
    $uri = $_SERVER['REQUEST_URI'];
    
    // For this example's sake
    $uri = 'http://xxxxxxxxxx.com/conference-events/rooms-capacities';
    
    $path = trim(parse_url($uri, PHP_URL_PATH), '/');
    
    $level = count(explode('/', $path));
    
    var_dump($level); // (int) 2
    

    See it on CodePad.

    【讨论】:

    • 正在解决这个问题,只是在校对。 +1 也用于使用 parse_url。
    • @alex:另外,你不需要-1 计数值吗,因为由于/ 路径前缀,你最终得到一个空条目?
    • @Brad Christie 我想我已经用trim() 解决了这个问题:)
    • @alex:Touché,甚至没听懂。
    • 请注意,REQUEST_URI 的内容不是必需的,因为这是在 Drupal 模板中,情况略有不同,请参阅下面的答案。
    【解决方案2】:

    不知道确切,如果我理解你,但似乎你正在寻找这样的东西

    $pathSegments = explode('/', $_SERVER['REQUEST_URI']);
    $level = 'level' . count($segments);
    

    【讨论】:

      【解决方案3】:

      7 响应和所有似乎都忽略了这是在 Drupal 内部的事实。 :)

      在 Drupal 中,该 URl 将被转换为:

      http://xxxxxxxxxx.com/?q=conference-events/rooms-capacities

      使用 mod_rewrite。

      此外,Drupal 已经删除了最终存在的尾部斜杠。所以你只需要:

      <?php
      $level = count(explode('/', $_GET['q'])); // request_path() in D7
      
      var_dump($level); // (int) 2
      ?>
      

      【讨论】:

      • 但要小心,因为如果您使用路径,?q= 将被重写。如果您转到会议活动/房间容量,路径将其更改回节点/123。因此,GET_['q'] 将返回 node/123,而不是 Conference-events/rooms-capacities。
      • 那个 URL 听起来不像是我的别名,更像是一个自定义/contrib 模块。但是您是对的,别名将更改为内部路径。在这种情况下,$_REQUEST['q'] 应该仍然包含原始别名。
      • 好吧,任何不是视图或由模块定义的东西都将是 node/*。所以我最好的选择是它可能是带有 Pathauto 的别名。但是,不确定......我想为了安全起见,使用 $_REQUEST['q'] 将是最安全的选择,并且无论设置如何都可以工作。
      【解决方案4】:

      当前 URL 以 $_SERVER['REQUEST_URI'] 的形式呈现给 PHP - 例如“/conference-events/rooms-capacities/bob”。

      您可以使用$x = explode('/', $_SERVER['REQUEST_URI']); 来获取每个级别包含一个项目的数组。从那里,您可以count($x) 数组中的项目数。

      【讨论】:

        【解决方案5】:

        除以/,统计获得的token数量。减去 3 来计算域名中的 3 /。

        所以:

        $numLvl = count(preg_split("|/|", $url)) - 3;

        【讨论】:

        • explode() 不适合的任何原因?
        • @alex:不是真的。双向工作。
        • 除了一个需要正则表达式引擎,一个不需要 :) 也见manual page上的说明 如果你不需要正则表达式的威力,你可以选择更快(虽然更简单)替代方案,如explode() 或str_split()。
        • @alex:这只是过早的优化。在普通网站(即每天有 1000 名访问者)和几个preg_split 电话上,你真的看不到两者之间的区别,这很可能是这里的情况。对每个函数运行 50 次 5000 次调用的试验,我得到 explode 的平均 (+/- SD) 运行时间为 0.0882 +/- 0.1732 毫秒,preg_split 为 0.1319 +/- 0.2233 毫秒(中位数:0.047 毫秒和 0.059 毫秒)。所以......正如你所看到的,虽然更快,explode 并没有那么快(通过减去 3 而不是修剪和调用parse_url 来恢复时间!)。
        • 只是说像这样简单的东西,explode() 似乎是最好的方法,即使只是出于可读性原因。
        【解决方案6】:

        假设您已经重写了您的网址,并且可以通过 $_GET 或其他方式将每个级别作为变量访问... $levels = count($_GET);

        只需根据自己的需要进行调整。

        【讨论】:

          【解决方案7】:

          其他答案似乎缺少从 URL 的最后一段派生的类。 因此,要获得计数:

          $level = count(explode('/', $_SERVER['REQUEST_URI']));
          $page = trim(strrchr($_SERVER['REQUEST_URI'], "/"), "/");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-28
            相关资源
            最近更新 更多