php使用parse_url和parse_str解析URL


Posted in PHP onFebruary 22, 2015

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的2种方法了,希望小伙伴们能够喜欢。

PHP 相关文章推荐
PHP类中Static方法效率测试代码
Oct 17 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
php curl选项列表(超详细)
Jul 01 PHP
php发送邮件的问题详解
Jun 22 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
php验证码实现代码(3种)
Sep 07 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
Jan 04 PHP
php的闭包(Closure)匿名函数详解
Feb 22 #PHP
PHP 实现代码复用的一个方法 traits新特性
Feb 22 #PHP
在Windows XP下安装Apache+MySQL+PHP环境
Feb 22 #PHP
PHP+APACHE实现网址伪静态
Feb 22 #PHP
php数组键名技巧小结
Feb 17 #PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 #PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 #PHP
You might like
ThinkPHP登录功能的实现方法
2014/08/20 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
python 提取文件的小程序
2009/07/29 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
分享python数据统计的一些小技巧
2016/07/21 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
Python any()函数的使用方法
2019/10/28 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Python requests模块session代码实例
2020/04/14 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
建筑工地门卫岗位职责
2014/04/30 职场文书
观看信仰心得体会
2014/09/04 职场文书
百万英镑观后感
2015/06/09 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书