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 相关文章推荐
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
php处理restful请求的路由类分享
Feb 27 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
thinkPHP模板算术运算相关函数用法分析
Jul 12 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 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
实用函数9
2007/11/08 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
.net面试题
2016/09/17 面试题
环保建议书作文
2014/03/12 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
篮球比赛策划方案
2014/06/05 职场文书
大班下学期个人总结
2015/02/13 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书