浅谈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邮件类
Jan 03 PHP
mysql总结之explain
Feb 27 PHP
redis 队列操作的例子(php)
Apr 12 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
PHP函数getenv简介和使用实例
May 12 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
php生成QRcode实例
Sep 22 PHP
使用Thinkphp框架开发移动端接口
Aug 05 PHP
PHP中error_reporting()用法详解
Aug 31 PHP
微信自定义分享php代码分析
Nov 24 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
Javascript 面向对象 命名空间
2010/05/13 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python3之文件读写操作的实例讲解
2018/01/23 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python读取指定日期邮件的实例
2019/02/01 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
python 实现性别识别
2020/11/21 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
办公室内勤工作职责
2013/12/11 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
护士自我介绍信
2014/01/13 职场文书
擅自离岗检讨书
2014/02/11 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
励志演讲稿300字
2014/08/21 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
Oracle使用别名的好处
2022/04/19 Oracle
python游戏开发Pygame框架
2022/04/22 Python