URL不会拆分成目录

时间:2018-01-28 14:13:39

标签: php url explode

我有一个将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);

为什么不发生这种情况?我一无所获!

2 个答案:

答案 0 :(得分:1)

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

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

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

或只是:

return $url[$part];

答案 1 :(得分:0)

有两个原因::

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

  2. @Syscall是正确的,/带有$_SERVER['PHP_SELF'],因此也会放弃您的元素定位。 1 - 1会让您访问0元素explode()的数组。 (我实际上不确定你为什么从$part减去1。)

  3. 我在这里时会提供一些额外的建议。

    • $part应该是一个整数,但让我们强制intval()为真。
    • 条件中使用
    • !$part来确定值是否为0
    • 我已经扩展了您的示例路径字符串以阐明我的下一个点。我建议添加$part+3作为explode()调用的第3个参数,以便该函数不必执行任何不必要的工作。对于这种情况,我们访问数组的元素2,因此将路径的其余部分阻塞到元素3中并不重要。 (参见demo的输出结果)
    • 在尝试按键访问数组元素之前,最好先检查密钥是否存在 - 以避免通知。这就是!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