浅谈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源码之explode使用说明
Aug 05 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
YII实现分页的方法
Jul 09 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
php自动获取关键字的方法
Jan 06 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
详解php用static方法的原因
Sep 12 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
yii分页组件用法实例分析
2015/12/28 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
Python 第一步 hello world
2009/09/25 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
快速了解Python相对导入
2018/01/12 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
检察官就职演讲稿
2014/01/13 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
2014年村官工作总结
2014/11/24 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
初三英语教学反思
2016/02/15 职场文书