php使用parse_url和parse_str解析URL


Posted in PHP onFebruary 22, 2015

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的2种方法了,希望小伙伴们能够喜欢。

PHP 相关文章推荐
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
基于php验证码函数的使用示例
May 03 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php实现httpRequest的方法
Mar 13 PHP
PHP中通过trigger_error触发PHP错误示例
Jun 23 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
Dec 25 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
yii2 resetful 授权验证详解
May 18 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
php的闭包(Closure)匿名函数详解
Feb 22 #PHP
PHP 实现代码复用的一个方法 traits新特性
Feb 22 #PHP
在Windows XP下安装Apache+MySQL+PHP环境
Feb 22 #PHP
PHP+APACHE实现网址伪静态
Feb 22 #PHP
php数组键名技巧小结
Feb 17 #PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 #PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 #PHP
You might like
PHP - Html Transfer Code
2006/10/09 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
php源码的安装方法和实例
2019/09/26 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
怎么用javascript进行拖拽
2006/07/20 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
轮播的简单实现方法
2016/07/28 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python tcp传输代码实例解析
2020/03/18 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
Hotels.com中国区:好订网
2016/08/18 全球购物
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
个人求职信范文分享
2013/12/13 职场文书
2014年保管员工作总结
2014/11/18 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
教师节班会主持词
2015/07/06 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android