浅谈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 相关文章推荐
ie6 动态缩略图不显示的原因
Jun 21 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
Laravel重写用户登录简单示例
Oct 08 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
php 解析非标准json、非规范json
Apr 01 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
DedeCms模板安装/制作概述
2007/03/11 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP文件上传类实例详解
2016/04/08 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
JavaScript中的类继承
2010/11/25 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python socket服务常用操作代码实例
2020/06/22 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
行政文员岗位职责
2013/11/08 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
户籍证明模板
2014/09/28 职场文书
党性分析材料格式
2014/12/19 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
教师思想工作总结2015
2015/05/13 职场文书
聘任书范文大全
2015/09/21 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
浅析MongoDB之安全认证
2021/06/26 MongoDB
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis