浅谈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 显示客户端IP与服务器IP的代码
Oct 12 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
CI框架Session.php源码分析
Nov 03 PHP
php比较相似字符串的方法
Jun 05 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
使用vs code编辑调试php配置的方法
Jan 29 PHP
设定php简写功能的方法
Nov 28 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
React简单介绍
2017/05/24 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
Node.js创建Web、TCP服务器
2017/12/05 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python应用库大全总结
2018/05/30 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
劳资员岗位职责
2013/11/11 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
大学毕业生自我评价
2015/03/02 职场文书
《观察物体》教学反思
2016/02/17 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang