【问题标题】:URL not splitting into directoriesURL 不拆分为目录
【发布时间】:2018-01-28 14:13:38
【问题描述】:

我有一个将 URL 分解为目录的函数。如果我在example.com/test/directory 访问此脚本,它应该返回test

function URLPart($part) {
    if ($part > 0) {
        $url = explode("/", $_SERVER['PHP_SELF']);
        return $url[$part - 1];
    } else {
        return $_SERVER['PHP_SELF'];
    }
}

URLPart(1);

为什么没有发生这种情况?我什么都得不到!

【问题讨论】:

    标签: php url explode


    【解决方案1】:

    $_SERVER['PHP_SELF'] 变量包含一个初始 /,例如"/test/directory".

    之前你必须ltrim($_SERVER['PHP_SELF'],'/')

    $url = explode("/", ltrim($_SERVER['PHP_SELF'], '/'));
    

    或者只是:

    return $url[$part];
    

    【讨论】:

      【解决方案2】:

      您得到一无所获的原因有两个:

      1. 因为函数调用不会打印到屏幕 -- echo 会。您需要回显您的 return 值。

      2. @Syscall 是正确的,有一个领先的 /$_SERVER['PHP_SELF'],所以这也会导致您的元素定位失效。 1 - 1 将让您访问 0 元素 explode() 的数组。 (实际上我不确定你为什么要从 $part 中减去 1。)

      在这里,我会提供一些额外的建议。

      • $part 应该是一个整数,但让我们用 intval() 强制它为真。
      • !$part 用于条件判断值是否为0
      • 我已经扩展了您的示例路径字符串以阐明我的下一点。我建议添加$part+3 作为explode() 调用的第三个参数,这样函数就不必做任何不必要的工作。对于这种情况,我们正在访问数组的元素2,因此将路径的其余部分塞入元素3 是没有意义的。 (请参阅演示的输出以了解其工作原理)
      • 在尝试通过键访问数组元素之前,最好先检查键是否存在——以避免出现通知。这就是!isset() 条件的原因。
      • ++$part 表示$part 加一。
      • 我更喜欢在我的代码中先写早期返回(失败),并将成功输出作为最低返回。正如我之前所说,echo 返回值。

      代码:(Demo)

      function URLPart($part){
          if(!$part=intval($part)){  // convert to integer and check if zero
              return '/example.com/test/directory/foo/bar/what'; // $_SERVER['PHP_SELF']
          }else{
              $url = explode("/",'/example.com/test/directory/foo/bar/what',$part+3); // $_SERVER['PHP_SELF']
              var_export($url);
              echo "\n\n";
              // when $part=1, offset 2 is desired
              if(!isset($url[++$part])){  // if incremented $part is an invalid / non-existent offset
                  return '/example.com/test/directory/foo/bar/what';  // change this to your needs
              }else{
                  return $url[$part];
              }
          }
      }
      
      echo URLPart(1);  // you must echo the return value if you want it to be printed to screen
      

      输出:

      array (
        0 => '',
        1 => 'example.com',
        2 => 'test',
        3 => 'directory/foo/bar/what',
      )
      
      test
      

      【讨论】:

        猜你喜欢
        • 2016-07-30
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        相关资源
        最近更新 更多