浅谈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 base64+gzinflate压缩编码和解码代码
Oct 03 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
PHP文件缓存类示例分享
Jan 30 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
php数组指针操作详解
Feb 14 PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
laravel-admin的多级联动方法
Sep 30 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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
Apache2 httpd.conf 中文版
2006/12/06 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
JS实现的排列组合算法示例
2019/07/16 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
vue实现登录功能
2020/12/31 Vue.js
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Python扩展内置类型详解
2018/03/26 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Django模板Templates使用方法详解
2019/07/19 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
会计辞职信范文
2014/01/15 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
基层工作经验证明样本
2014/11/16 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS