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读取XML值的代码(推荐)
Jan 01 PHP
php编写一个简单的路由类
Apr 13 PHP
mysql数据库差异比较的PHP代码
Feb 05 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
PHP文件上传处理案例分析
Oct 15 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
python 解压pkl文件的方法
2018/10/25 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
什么是网络协议
2016/04/07 面试题
语文高效课堂实施方案
2014/05/03 职场文书
小班上学期评语
2014/05/05 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
身份证丢失证明
2015/06/19 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers