浅谈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脚本代码
Feb 19 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
php启动时候提示PHP startup的解决方法
May 07 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
PHP实现数组array转换成xml的方法
Jul 19 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
PHP实现的mysql读写分离操作示例
May 22 PHP
php实现映射操作实例详解
Oct 02 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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 危险函数解释 分析
2009/04/22 PHP
8个PHP数组面试题
2015/06/23 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python打印异常信息的两种实现方式
2019/12/24 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android