在 PHP 中获取 URL 的一部分

Getting parts of a URL in PHP

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

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

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

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

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

例如:5 login?q=san&u=post#top

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

我检查了 parse_url 功能,但没有 return 我需要的功能。因为,我是 PHP 的初学者,这对我来说很难。如果您有任何想法,请回答。

提前致谢。

PHP 提供了一个 parse_url 函数。

This function parses a URL and returns an associative array containing any of the various components of the URL that are present.

This function is not meant to validate the given URL, it only breaks it up into the above listed parts. Partial URLs are also accepted, parse_url() tries its best to parse them correctly.


您可以看到测试用例executed here

$urls = array(
  "https://whosebug.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) );
}

我正在使用它来定位 root 和 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=用户&action=概览

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

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