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 相关文章推荐
php获得文件扩展名三法
Nov 25 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
php max_execution_time执行时间问题
Jul 17 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
apache中为php 设置虚拟目录
Dec 17 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
微信支付开发订单查询实例
Jul 12 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
php合并数组并保留键值的实现方法
Mar 12 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
thinkPHP框架实现多表查询的方法
Jun 14 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超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
利用js对象弹出一个层
2008/03/26 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
Python生成随机MAC地址
2015/03/10 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
python机器学习库xgboost的使用
2020/01/20 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
异常和异常类的概念
2014/09/12 面试题
人力资源经理自我评价
2014/01/04 职场文书
擅自离岗检讨书
2014/02/11 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
广告词串烧
2014/03/19 职场文书
知识竞赛主持词
2014/03/26 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
在职员工证明书
2014/09/19 职场文书
消防安全月活动总结
2015/05/08 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP