浅谈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查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php 定义404页面的实现代码
Nov 19 PHP
PHP编码规范的深入探讨
Jun 06 PHP
PHP多进程编程实例
Oct 15 PHP
PHP+jQuery翻板抽奖功能实现
Oct 19 PHP
ThinkPHP路由机制简介
Mar 23 PHP
PHP简单读取xml文件的方法示例
Apr 20 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
phpStorm2020 注册码
Sep 17 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
操作Oracle的php类
2006/10/09 PHP
php连接数据库代码应用分析
2011/05/29 PHP
PHP文件与目录操作示例
2016/12/24 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
JS作用域深度解析
2016/12/29 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
python制作websocket服务器实例分享
2016/11/20 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
大学生简历的个人自我评价
2013/12/04 职场文书
入党积极分子介绍信
2014/01/17 职场文书
仓库管理制度范本
2015/08/04 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
python字典进行运算原理及实例分享
2021/08/02 Python
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技