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下几种删除目录的方法总结
Aug 19 PHP
php Memcache 中实现消息队列
Nov 24 PHP
如何判断php数组的维度
Jun 10 PHP
php curl_init函数用法
Jan 31 PHP
php根据一个给定范围和步进生成数组的方法
Jun 19 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
php格式化时间戳
Dec 17 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
php数值计算num类简单操作示例
May 15 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 代码优化之经典示例
2011/03/24 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
分享Python文本生成二维码实例
2016/01/06 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
python中sys.argv函数精简概括
2018/07/08 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Django 返回json数据的实现示例
2020/03/05 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
Footshop法国:购买运动鞋
2020/01/19 全球购物
团员的自我评价
2013/12/01 职场文书
活动策划邀请函
2014/02/06 职场文书
教师师德工作总结2015
2015/07/22 职场文书