浅谈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来检测proxy
Oct 09 PHP
php基础知识:函数基础知识
Dec 13 PHP
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
php网页后退不再出现过期
Mar 08 PHP
PHP下10件你也许并不了解的事情
Sep 11 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php接口数据加密、解密、验证签名
Mar 12 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
PHP实现简单用户登录界面
Oct 23 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
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
分享Python字符串关键点
2015/12/13 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
python实现随机梯度下降法
2020/03/24 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python中wheel的用法整理
2020/06/15 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
初二政治教学反思
2014/01/12 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
MySQL 开窗函数
2022/02/15 MySQL