浅谈PHP解析URL函数parse_url和parse_str


Posted in PHP onNovember 11, 2014

PHP中有两个方法可以用来解析URL,分别是parse_url和parse_str。

parse_url
解析 URL,返回其组成部分

mixed parse_url ( string $url [, int $component = -1 ] )

本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。

参数

url  要解析的 URL。无效字符将使用 _ 来替换。

component  指定 PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、 PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string。 (除了指定为 PHP_URL_PORT 后,将返回一个 integer 的值)。

返回值

对严重不合格的 URL,parse_url() 可能会返回 FALSE。

如果省略了 component 参数,将返回一个关联数组 array,在目前至少会有一个元素在该数组中。数组中可能的键有以下几种:

scheme - 如 http
host
port
user
pass
path
query - 在问号 ? 之后
fragment - 在散列符号 # 之后
如果指定了 component 参数, parse_url() 返回一个 string (或在指定为 PHP_URL_PORT 时返回一个 integer)而不是 array。如果 URL 中指定的组成部分不存在,将会返回 NULL。

实例

<?php

$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);

?>

以上例程会输出:

Array

(

    [scheme] => http

    [host] => hostname

    [user] => username

    [pass] => password

    [path] => /path

    [query] => arg=value

    [fragment] => anchor

)

/path

parse_str

将字符串解析成多个变量

void parse_str ( string $str [, array &$arr ] )

如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。

获取当前的 QUERY_STRING,你可以使用 $_SERVER['QUERY_STRING'] 变量。

参数

str  输入的字符串。

arr  如果设置了第二个变量 arr,变量将会以数组元素的形式存入到这个数组,作为替代。、

实例

<?php

$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str);

echo $first;  // value

echo $arr[0]; // foo bar

echo $arr[1]; // baz

parse_str($str, $output);

echo $output['first'];  // value

echo $output['arr'][0]; // foo bar

echo $output['arr'][1]; // baz

?>

前一段时间在读php-resque的源码,看到了在其中对这两个的方法的应用,感觉用的很好,用来解析redis链接的设置。

redis链接的格式是:redis://user:pass@host:port/db?option1=val1&option2=val2,是不是和URL一样,所以用以上两个方法很容易解析。

地址: https://github.com/chrisboulton/php-resque/blob/master/lib/Resque/Redis.php

代码如下:

    /**

     * Parse a DSN string, which can have one of the following formats:

     *

     * - host:port

     * - redis://user:pass@host:port/db?option1=val1&option2=val2

     * - tcp://user:pass@host:port/db?option1=val1&option2=val2

     *

     * Note: the 'user' part of the DSN is not used.

     *

     * @param string $dsn A DSN string

     * @return array An array of DSN compotnents, with 'false' values for any unknown components. e.g.

     *               [host, port, db, user, pass, options]

     */

    public static function parseDsn($dsn)

    {

        if ($dsn == '') {

            // Use a sensible default for an empty DNS string

            $dsn = 'redis://' . self::DEFAULT_HOST;

        }

        $parts = parse_url($dsn);

        // Check the URI scheme

        $validSchemes = array('redis', 'tcp');

        if (isset($parts['scheme']) && ! in_array($parts['scheme'], $validSchemes)) {

            throw new \InvalidArgumentException("Invalid DSN. Supported schemes are " . implode(', ', $validSchemes));

        }

        // Allow simple 'hostname' format, which `parse_url` treats as a path, not host.

        if ( ! isset($parts['host']) && isset($parts['path'])) {

            $parts['host'] = $parts['path'];

            unset($parts['path']);

        }

        // Extract the port number as an integer

        $port = isset($parts['port']) ? intval($parts['port']) : self::DEFAULT_PORT;

        // Get the database from the 'path' part of the URI

        $database = false;

        if (isset($parts['path'])) {

            // Strip non-digit chars from path

            $database = intval(preg_replace('/[^0-9]/', '', $parts['path']));

        }

        // Extract any 'user' and 'pass' values

        $user = isset($parts['user']) ? $parts['user'] : false;

        $pass = isset($parts['pass']) ? $parts['pass'] : false;

        // Convert the query string into an associative array

        $options = array();

        if (isset($parts['query'])) {

            // Parse the query string into an array

            parse_str($parts['query'], $options);

        }

        return array(

            $parts['host'],

            $port,

            $database,

            $user,

            $pass,

            $options,

        );

    }

以上就是个人关于php解析URL函数parse_url和parse_str的理解,这里记录下来,分享给大家,希望对小伙伴有所帮助

PHP 相关文章推荐
用来给图片加水印的PHP类
Apr 09 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
PHP里的单例类写法实例
Jun 25 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
php 数据结构之链表队列
Oct 17 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
php 魔术方法详解
Nov 11 #PHP
php多个文件及图片上传实例详解
Nov 10 #PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 #PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 #PHP
php json转换成数组形式代码分享
Nov 10 #PHP
PHP冒泡算法详解(递归实现)
Nov 10 #PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 #PHP
You might like
PHP文件读写操作之文件写入代码
2011/01/13 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
php fread函数使用方法总结
2019/05/28 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
jQuery代码优化 事件委托篇
2011/11/01 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python 忽略文件名编码的方法
2020/08/01 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
劳动之星获奖感言
2014/02/01 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
护理专业求职信
2014/06/15 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
企业介绍信范文
2015/01/30 职场文书
个性与发展自我评价
2015/03/06 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
爱国主义电影观后感
2015/06/18 职场文书