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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php中目录,文件操作详谈
Mar 19 PHP
php面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
php处理restful请求的路由类分享
Feb 27 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
php简单防盗链实现方法
Jul 29 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
laravel中命名路由的使用方法
Feb 24 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 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
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
php操作mongoDB实例分析
2014/12/29 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
python爬虫框架talonspider简单介绍
2017/06/09 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python 元组操作总结
2019/09/18 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
一套C++笔试题面试题
2012/06/06 面试题
户籍证明的格式
2014/01/13 职场文书
庆八一活动方案
2014/01/25 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
中标通知书格式
2015/04/17 职场文书
钱学森观后感
2015/06/04 职场文书
68句权威创业名言
2019/08/26 职场文书
创业的9条正确思考方式
2019/08/26 职场文书