PHP中的URL处理

Posted YunGaZeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中的URL处理相关的知识,希望对你有一定的参考价值。

一,函数介绍

1.解析HTTP头信息:get_header()

array get_headers ( string 目标URL [, int $format = 0 【如果将可选的 format 参数设为 1,则 get_headers() 会解析相应的信息并设定数组的键名】] )

返回包含有服务器响应一个 HTTP 请求所发送标头的索引或关联数组,如果失败则返回 FALSE

相似的还有

apache_request_headers(void) 返回包含当前Apache请求所有头信息的数组,失败返回 FALSE 。

apache_response_headers(void)成功时返回包含全部 Apache 响应头信息的数组, 或者在失败时返回 FALSE.

 


 

2.解释meta标签:get_meta_tags()

array get_meta_tags ( string $filename [, bool $use_include_path = false ] )

参数:

filename

  html 文件的路径字符串。 此参数可以是本地文件也可以是一个 URL

use_include_path

  将 use_include_path 设置为 TRUE 将使 php 尝试按照 include_path 标准包含路径中的每个指向去打开文件。这只用于本地文件,不适用于 URL。

打开 filename 逐行解析文件中的 <meta> 标签。解析工作将在 </head> 处停止。

返回一个数组,包含所有解析过的 meta 标签。

返回的关联数组以属性 name 的值作为键,属性 content 的值作为值,所以你可以很容易地使用标准数组函数遍历此关联数组或访问某个值。 属性 name 中的特殊字符将使用‘_’替换,而其它字符则转换成小写。如果有两个 meta 标签拥有相同的 name,则只返回最后出现的那一个。


 

3.生成URL请求字符串:http_build_query()

string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

参数:

query_data

  可以是数组或包含属性的对象。

  一个 query_data 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。

  如果 query_data 是一个对象,只有 public 的属性会加入结果。

numeric_prefix

  如果在基础数组中使用了数字下标同时给出了该参数,此参数值将会作为基础数组中的数字下标元素的前缀。

  这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。

arg_separator

  除非指定并使用了这个参数,否则会用 arg_separator.output 来分隔参数。

enc_type

  默认使用 PHP_QUERY_RFC1738

  如果 enc_type 是 PHP_QUERY_RFC1738,则编码将会以 ? RFC 1738 标准和 application/x-www-form-urlencoded 媒体类型进行编码,空格会被编码成加号(+)。

  如果 enc_type 是 PHP_QUERY_RFC3986,将根据 ? RFC 3986 编码,空格会被百分号编码(%20)。

返回:

  返回一个 URL 编码后的字符串。

例:

技术分享
<?php

$data = array(
              ‘mother‘,‘father‘,‘son‘,
              ‘foo‘=>‘bar‘,
              ‘baz‘=>‘boom‘,
              ‘cow‘=>‘milk‘,
              ‘php‘=>‘hypertext processor‘,
              ‘user‘=>array(
                    ‘name‘=>‘bob‘,
                    ‘age‘=>17,
                    ‘class‘=>‘one‘
                    )
              );

echo http_build_query($data) . "<br/>";
echo http_build_query($data, ‘‘, ‘&amp;‘).‘<br/>‘;
echo http_build_query($data, ‘P_‘, ‘&amp;‘).‘<br/>‘;

输出:
/*
0=mother&1=father&2=son&foo=bar&baz=boom&cow=milk&php=hypertext+processor&user%5Bname%5D=bob&user%5Bage%5D=17&user%5Bclass%5D=one
0=mother&1=father&2=son&foo=bar&baz=boom&cow=milk&php=hypertext+processor&user%5Bname%5D=bob&user%5Bage%5D=17&user%5Bclass%5D=one
P_0=mother&P_1=father&P_2=son&foo=bar&baz=boom&cow=milk&php=hypertext+processor&user%5Bname%5D=bob&user%5Bage%5D=17&user%5Bclass%5D=one
*/
View Code

 

 


 

4.解析URL并返回其组成部分:parse_url()

mixed parse_url ( string $url [, int $component = -1 ] )

参数

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

parse_url可以解释丢失协议的url如://www.baidu.com/index.php?a=1&b=2

parse_url不能用于相对url


 

 

5.将字符串解释成多个变量:parse_str()

void parse_str ( string $str [, array &$arr ] )

如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。

获取当前的 QUERY_STRING,你可以使用 $_SERVER[‘QUERY_STRING‘] 变量。

magic_quotes_gpc 影响到了 parse_str() 这个函数的输出,和 PHP 用于填充 $_GET、 $_POST 及其他变量的机制一致。

 

虽然第二个参数为可选,但如果不填,则处理后的数据也无处安放,因此一般2个参数都填上。

例:parse_str完美解释http_bulid_query()生成的请求字符串

技术分享
<?php
$data = array(
              ‘mother‘,‘father‘,‘son‘,
              ‘foo‘=>‘bar‘,
              ‘baz‘=>‘boom‘,
              ‘cow‘=>‘milk‘,
              ‘php‘=>‘hypertext processor‘,
              ‘user‘=>array(
                    ‘name‘=>‘bob‘,
                    ‘age‘=>17,
                    ‘class‘=>‘one‘
                    )
              );

$query=http_build_query($data);
parse_str($query,$arr);
var_dump($arr);

/*
输出
array (size=8)
  0 => string ‘mother‘ (length=6)
  1 => string ‘father‘ (length=6)
  2 => string ‘son‘ (length=3)
  ‘foo‘ => string ‘bar‘ (length=3)
  ‘baz‘ => string ‘boom‘ (length=4)
  ‘cow‘ => string ‘milk‘ (length=4)
  ‘php‘ => string ‘hypertext processor‘ (length=19)
  ‘user‘ => 
    array (size=3)
      ‘name‘ => string ‘bob‘ (length=3)
      ‘age‘ => string ‘17‘ (length=2)
      ‘class‘ => string ‘one‘ (length=3)
*/
View Code

 


 

 

6.URL参数字符串编码,解码:urlencode(),urldecode()

string urlencode ( string $str )

此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 ? RFC3896 编码(参见 rawurlencode())不同。

 

string urldecode ( string $str )

解码给出的已编码字符串中的任何 %##。 加号(‘+‘)被解码成一个空格字符。

返回解码后的字符串。

 

注意改函数仅用于对URL请求参数部分进行编解码。


 

 

7.URL参数字符串编码,解码:rawurlencode(),rawurldecode()

string rawurlencode ( string $str )

根据 ? RFC 3986 编码指定的字符。

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 ? RFC 3986 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。

string rawurldecode ( string $str )

返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。

rawurldecode() 不会把加号(‘+‘)解码为空格,而 urldecode() 可以。

 

8.获取文件路径信息:pathinfo()

mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )

 

pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options

参数:

path

  要解析的路径。

options

  如果指定了,将会返回指定元素;它们包括:PATHINFO_DIRNAMEPATHINFO_BASENAME 和 PATHINFO_EXTENSION 或 PATHINFO_FILENAME

  如果没有指定 options 默认是返回全部的单元。

返回:

  如果没有传入 options ,将会返回包括以下单元的数组 arraydirnamebasename 和 extension(如果有),以 及filename。如果有,则返回options所指定的值

相似的还有:

  dirname()返回文件路径目录部分,相当于pathinfo(path,PATHINFO_DIRNAME)

  basename()返回路径中文件名部分,相当于pathinfo(path,PATHINFO_BASENAME)

 


 

 

二,实践应用

1.获取URL中的参数

例:http://www.baidu.com/index.php?m=content&c=index&a=lists&catid=6&area=0&author=九把刀&h=嘿嘿嘿‘

 

解决方法:

//第一种:切割字符串
function params($url)
{
    $p=[];
    $urls=explode(‘?‘,$url);
    $params=str_replace(‘&&‘,‘&‘,$urls[1]);
    $params_arr=explode(‘&‘,$params);
    foreach($params as $param)
    {
        $_v=explode(‘=‘,$param);
        $p[$_v[0]]=$_v[1];
    }
    return $p;
}

 

//第二种:使用正则匹配
function params($url)
{
    $p=[];
    preg_match_all(‘/([^\=\?\&]+)\=([^&$]+)/‘,$url,$matches);
    
    foreach($matches[1] as $k=>$v)
    {
        $p[$matches[1][$k]]=$matches[2][$k];
    }
    return $p;
}
//第三种,使用parse_url配合parse_str,最简便
function params($url)
{
    $query=parse_url($url,PHP_URL_QUERY);
    //或parse_url($url)[‘query‘]
    parse_str($query,$p);
    return $p;
}

 

 

2,将HTML文档中的<img src="/images/1.jpg">替换为绝对路径,根目录http://www.pic.com

解决:

$newdoc=preg_replace_callback(‘/<img[\s\S]+src\s*=\s*[\‘\"](\/[^\‘\"]+)[\‘\"]/‘,function($m){
    
    if(empty(parse_url($m[1],PHP_URL_HOST)))
    {
        $newsrc=‘http://www.pic.com/‘.ltrim($m[1],‘/‘);
        return str_replace($m[1],$newsrc,$m[0]);
    }
    
},$html);

 

 

未完...

 

以上是关于PHP中的URL处理的主要内容,如果未能解决你的问题,请参考以下文章

在保持相同行为的同时隐藏 url 中的 #hash 片段?

如何从URL获取片段标识符(hash#之后的值)?

PHP 代码片段

VSCode自定义代码片段3——url大全

VSCode自定义代码片段3——url大全

VSCode自定义代码片段3——url大全