在PHP中获取URL的一部分

时间:2015-11-16 10:23:44

标签: php regex url urlparse

如何使用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)
  • 片段(顶部)

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

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

Ex: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)
  • 片段(顶部)
  • 剩余(返回空字符串)

Ex:5登录?q = san& u = post#top

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

Ex:6?q = san& u = post

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

PHP提供parse_url函数。

  

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

     

此功能并不意味着验证给定的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) ); } 会尽力正确解析它们。

您可以看到测试用例executed here

TestActivity

答案 1 :(得分:1)

我用它来找到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 = User&amp; action = overview

这相当于我的某个菜单项的网址。 您可以在最后一个URL上使用explode来查找所需的所有其他值。

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