-3

如何使用 PHP 函数提取以下部分:

  • 领域
  • 没有文件的路径
  • 文件
  • 带有扩展名的文件
  • 没有扩展名的文件
  • 方案
  • 港口
  • 查询
  • 片段
  • (添加您认为有用的任何其他内容)

例 1 https://stackoverflow.com/users/test/login.php?q=san&u=post#top

  • 域 (stackoverflow.com)
  • 没有文件的路径(/users/test/)
  • 文件(login.php)
  • 文件扩展名 (.php)
  • 没有扩展名的文件(登录)
  • 方案(https:)
  • 端口(返回空字符串)
  • 查询(q=san&u=post)
  • 片段(上)

例如:2 stackoverflow.com/users/test/login.php?q=san&u=post#top

  • 域 (stackoverflow.com)
  • 没有文件的路径(/users/test/)
  • 文件(login.php)
  • 文件扩展名 (.php)
  • 没有扩展名的文件(登录)
  • 方案(返回空字符串)
  • 端口(返回空字符串)
  • 查询(q=san&u=post)
  • 片段(上)

例如:3 /users/test/login.php?q=san&u=post#top

  • 没有文件的路径(/users/test/)
  • 文件(login.php)
  • 文件扩展名 (.php)
  • 没有扩展名的文件(登录)
  • 查询(q=san&u=post)
  • 片段(上)
  • 对于剩余(返回空字符串)

例如:4 /users/test/login?q=san&u=post#top

  • 没有文件的路径(/users/test/)
  • 文件(登录)
  • 文件扩展名(返回空字符串)
  • 没有扩展名的文件(登录)
  • 查询(q=san&u=post)
  • 片段(上)
  • 对于剩余(返回空字符串)

例如:5 次登录?q=san&u=post#top

  • 文件(登录)
  • 文件扩展名(返回空字符串)
  • 没有扩展名的文件(登录)
  • 查询(q=san&u=post)
  • 片段(上)
  • 对于剩余(返回空字符串)

例如:6 ?q=san&u=post

  • 查询(q=san&u=post)
  • 对于剩余(返回空字符串)

我检查了 parse_url 函数,但没有返回我需要的。因为,我是 PHP 的初学者,所以对我来说很难。如果您有任何想法,请回答。

提前致谢。

4

2 回答 2

1

PHP 提供了一个parse_url函数。

此函数解析 URL 并返回一个关联数组,其中包含存在的 URL 的任何各种组件。

这个函数并不意味着验证给定的 URL,它只是把它分解成上面列出的部分。部分 URL 也被接受, parse_url()尽量正确解析它们。


您可以在此处查看执行的测试用例。

$urls = array(
  "https://stackoverflow.com/users/test/login.php?q=san&u=post#top",
  "/users/test/login.php?q=san&u=post#top",
  "?q=san&u=post#top",
  "login.php?q=san&u=post#top",
  "/users/test/login?q=san&u=post#top",
  "login?q=san&u=post#top"
);
foreach( $urls as $x ) {
  echo $x . "\n";
  var_dump( parse_url($x) );
}
于 2015-11-16T10:26:49.927 回答
1

我正在使用它来定位根和 webroot

<?php

/**
 * @brief get paths from the location where it was executed.
 */
class PathHelper {
    /**
     * @brief This function tries to determine the FileSystem root of the application. (needs to be executed in the root)
     * @return string
     */
    public static function locateRoot($file) {
        $dir = dirname($file);
        /** FIX Required for WINDOWS * */
        $dir = preg_replace('/\\\\/', '/', $dir);
        $dir = preg_replace('/\\\/', '/', $dir);
        return $dir;
    }

    /**
     * @brief This function tries to determine the WebRoot. (needs to be executed in the root)
     * @return string
     */
    public static function locateWebroot($file) {
        $docroot = $_SERVER['DOCUMENT_ROOT'];
        $dir = dirname($file);
        if ($dir == $docroot) {
            $webroot = "";
        } else {
            $webroot = substr_replace($dir, '', 0, strlen($docroot));
        }
        /** FIX Required for WINDOWS * */
        $webroot = preg_replace('/\\\\/', '/', $webroot);
        $webroot = preg_replace('/\\\/', '/', $webroot);
        return $webroot;
    }
}

我将它设置为一个常量,这样我就可以在我的整个应用程序中使用它。

例如:

对于菜单,您可以执行以下操作:

   // the requested url
    $requestedUrl = $_SERVER['REQUEST_URI'];

    // remove the webroot from the requested url
    $requestedUrl = str_replace(WEBROOT, "", $_SERVER['REQUEST_URI']);

    // take away the / if they still exist at the beginning
    $requestedUrl = ltrim($requestedUrl, "/");

然后我得到了这个: index.php?controller=User&action=overview

这等于我的菜单项之一的 url。您可以在最后一个 url 上使用 explode 来查找您想要的所有其他值。

编辑:使用 parse_url() 可能更好。我不习惯 PHP 中的所有函数,但如果没有任何作用,那么这至少是一个后备。

于 2015-11-16T10:35:06.550 回答