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技术构造远程服务(下)
Oct 09 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
Smarty模板变量与调节器实例详解
Jul 20 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 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 form 表单传参明细研究
2009/07/17 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
python二叉树的实现实例
2013/11/21 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Pyqt5实现英文学习词典
2019/06/24 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
韩国商务邀请函
2014/01/14 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
大学生实习证明
2015/06/16 职场文书
工作简报范文
2015/07/21 职场文书