浅谈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 相关文章推荐
BBS(php &amp; mysql)完整版(七)
Oct 09 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
php使用PDO方法详解
Dec 27 PHP
php+mysql实现简单的增删改查功能
Jul 13 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
Yii2单元测试用法示例
Nov 12 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 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
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
js给selected添加options的方法
2015/05/06 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python pandas修改列属性的方法详解
2018/06/09 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
详解Python用户登录接口的方法
2019/04/17 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
外贸业务员工作职责
2014/01/06 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
Python PIL按比例裁剪图片
2022/05/11 Python