PHP使用http_build_query构造URL字符串的方法_php技巧_脚本之家

本文实例讲述了PHP使用http_build_query()构造URL字符串的方法。分享给大家供大家参考,具体如下:

什么是http_build_query?

PHP中的字符串操作功能是比较多的,重要的有以下这些:
echo,print,printf,sprintf
前两个函数是输出字符串.字符串中如果有变量名则被替换成其值.
后两个函数类似于C的同名函数.
strchr,strlen,strtok,strrchr,strrev,strstr,strtolower,
strtoupper,substr,ucfirst

这些是常用的字符串操作函数,有些和C中的同名函数意义完全一致.
strrev是把一个字符串翻转. strtolower和strtoupper的意思应该不用解释了.
ucfirst是把字符串的第一个字符变成大写.
substr是返回字符串的一个子串,用法是:substr.
头位置是从0算起的.如果是负数,则是从尾部向前数的意思. Chr,Ord
类似于C的同名函数. explode,implode,join 这些是和数组有关的函数.
explode返回一个将字符串在分割符处分开所产生的数组.
implode返回一个将数组各元素之间插上分割符而成的字符串.
join与implode意义相同. Chop 去掉字符串尾部的空白.
htmlspecialchars 将字符串中的HTML特殊字符换成它们的名字,例如\”nl2br
在字符串中的每一个回车前面加上\”
\”. AddSlashes,StripSlashes
分别给字符串中需要加上\”\\”才能用于数据库查询的字符加上和去掉\”\\”.
parse_str
将\”name1=value1&name2=value2&…\”类型的字符串分析成一些变量. 例如:
parse_str; 生成$a与$b两个变量,值分别为1,2.
如果有两对名字/值的名字部分相同,则后一个的值覆盖前一个的.
如果这两对的名字尾部都有\”[]\”,例如\”a[]=1&a[]=2\”,则生成数组$a,两个元素分别为1,2

如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。下面的方法可以解决该问题:

1.确定一个字符串的长度
这是文章中最明显的一个例子,其中的问题是我们如何来确定一个字符串的长度,这里我们不能不提的就是strlen()函数:
复制代码 代码如下: $text = “sunny day”;
$count = strlen; // $count = 9 2.截取文本,创建一个摘要
新闻性质的网站通常会截取一个大约200字左右的段落,并在次段落的末尾加上省略号来形成一个摘要,这时,你可以使用substr_replace()函数来实现此功能。由于篇幅的原因,这里只演示对40个字符的限制:
复制代码 代码如下: $article = “BREAKING
NEWS: In ultimate irony, man bites dog.”; $summary = substr_replace; //
$summary = “BREAKING NEWS: In ultimate irony, man bi…”
3.计算字符串中的字符和单词数
相信您经常会看到一些博客或者新闻类文章,来总结文章的总字数,或者我们也经常看到一些投稿的要求:在一定的字数范围内。这时,你可以使用str_word_count()函数来计算文章字数的总和:
复制代码 代码如下: $article = “BREAKING
NEWS: In ultimate irony, man bites dog.”; $wordCount = str_word_count;
// $wordCount = 8
有的时候你需要更加严格的控制投稿者的使用空间,例如一些批注等等。如果你想知道有多少个字符来组成一个数组,请使用count_chars()函数。
4.解析CSV文件
数据通常是以逗号分隔的形式存储在文件中的,CSV文件使用一个逗号或者类似于预定义符号,将每列字符串组成一个单独的行。你可能经常创建PHP脚本来导入这些数据,或者解析出你所需要的东西,这些年来,我也看到过很多解析CSV文件的方法,最常见的就是使用fgets函数的组合来读取和解析文件,然而,最简单的方法是使用一个函数来解决问题,但它并不属于PHP的字符串处理库里的一部分:fgetcsv和fgetcsv()函数,我们能够很容易的解析这个文件,同时检索出每个联系人的名字:
复制代码 代码如下: $fh = fopen;
while($line = fgetcsv { echo “Contact: {$line[1]}”; }
5.转换成一个字符串数组
某些时候,你可能需要创建CSV文件,同时又在这些文件中进行读取,这就意味着你需要将那些同逗号分隔的字符串转换成数据。如果这些数据最初是从数据库检索出的,那么它很可能会只给您提供一个数组。这时,您可以使用implode()函数,将这些字符串转换成一个数组:
复制代码 代码如下: $csv = implode;
6.将网址转换成超链接
目前许多WYSIWYG编辑器提供的工具栏,都允许用户标记文本,包括超链接。但是,当内容呈现到页面上时,你可以很容易的自动执行此过程,同时保证您不出现额外的错误。要转换成超链接的URL,你可以使用preg_replace()函数,它可以按照正则表达式来搜索一个字符串,并定义了URL的结构:
复制代码 代码如下: $url = “W.J. Gilmore,
LLC ()”; $url = preg_replace(“/http:///”, “$0”,
$url); // $url = “W.J. Gilmore, LLC ()”
7.从一个字符串中去除HTML标签
作为Web开发人员,其中的一个主要工作就是要确保用户输入中不含有危险字符,如果有,这会导致SQL注入或脚本攻击。PHP语言中包含了很多安全方面的功能,这些功能能够帮助你过滤数据,包括延长过滤器。例如,你可以允许用户中带有一些基本的HTML语句,包括一些注释。实现这个功能,你可以使用带有检查功能函数:strip_tags()。它在默认的情况下是从字符串中删除所有的HTML标签,但同时也允许覆盖默认或者你指定的标签。例如,在下面的例子中,你可以除去所有的标签:
复制代码 代码如下: $text = strip_tags;
8.比较两个字符串
比较两个字符串,以确保它们是相同的。例如,判断用户第一次与第二次输入的密码是否相同,你可以使用substr_compare()函数来很容易的现实:
复制代码 代码如下: $pswd = “secret”;
$pswd2 = “secret”; if (! strcmp { echo “The passwords are not
identical!”; }
如果你想判断两个字符串不区分大小写,可以使用strcasecmp()函数。
9.转换换行符
在本文中我介绍了如何轻松转换成超超链接的URL,现在介绍nl2br()函数,这个函数能够帮助你将任何换行符转换成HTML标签。
复制代码 代码如下: $comment = nl2br;
10.应用自动换行
应用自动换行,你可以使用PHP中的这个函数:wordwrap(): 复制代码 代码如下: $speech = “Four score and
seven years ago our fathers brought forth, upon this continent, a new
nation, conceived in Liberty, and dedicated to the proposition that all
men are created equal.”; echo wordwrap; 执行上面的代码,结果是: Four
score and seven years ago our fathers brought forth, upon this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal.
原文地址:
原文名:10 Easy Solutions for PHP String Manipulation 作者:W. Jason
Gilmore

简单来说,http_build_query()就是将一个数组转换成url
问号?后面的参数字符串,并且会自动进行urlencode处理。

使用给出的关联数组生成一个经过 URL-encode 的请求字符串。参数 formdata
可以是数组或包含属性的对象。一个 formdata
数组可以是简单的一维结构,也可以是由数组组成的数组。如果在基础数组中使用了数字下标同时给出了
numeric_prefix
参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP
或其它 CGI
程序在稍后对数据进行解码时获取合法的变量名http_build_query有多种用法,不仅可以传入关联数组,同时也可以传入索引数组,甚至多维数组以及对象。

URL安全的字符串编码:复制代码
代码如下:function urlsafe_b64encode { $data = base64_encode; $data =
str_replace,array; return $data;}

还是引用一下官方的解释:

http_build_query怎么使用?复制代码
代码如下:string http_build_query ( array $formdata [, string
$numeric_prefix ] )

URL安全的字符串解码:复制代码
代码如下:function urlsafe_b64decode { $data = str_replace,array; $mod4
= strlen % 4; if { $data .= substr; } return base64_decode;}

http_build_query

传入一维关联数组

http_build_query — 生成 url-encoded 之后的请求字符串描述string
http_build_query ( array formdata [, string numeric_prefix] )

复制代码 代码如下:Array( [name] =>
lizhong [age] => 18)name=lizhong&age=18

使用给出的关联数组生成一个 url-encoded 请求字符串。参数 formdata
可以是数组或包含属性的对象。一个 formdata
数组可以是简单的一维结构,也可以是由数组组成的数组。如果在基础数组中使用了数字下标同时给出了
numeric_prefix
参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP
或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。

传入一维索引数组

还是看一些简单的例子吧:

复制代码 代码如下:Array( [0] =>
lizhong [1] => 18)0=lizhong&1=18传入二维数组复制代码 代码如下:Array( [a] => Array

$data = array( 'foo'=>'bar', 'baz'=>'boom', 'site'=>'www.jb51.net', 'name'=>'nowa jb51');echo http_build_query;/* output foo=bar&baz=boom&site=www.jb51.net&name=nowa+jb51*/

a%5Ba%5D=a&a%5Bb%5D=b&c=c传入对象复制代码 代码如下:class Obj{ public $a = ‘a’;
public $b = ‘b’; private $c = ‘c’; public function func(){ return;
}}$obj = new Obj();$str = http_build_query;echo $str;输出:复制代码
代码如下:a=a&b=b因为$c为私有变量,所以访问不到$c成员,于是只有a与b被输出。而对象里的function也不会被打印出来!

如果是索引数组与关联数组混合而成的数组又如何呢?

$data = array( 'foo', 'bar', 'site'=>'www.jb51.net', 'name'=>'nowa jb51');echo http_build_query;/* output 0=foo&1=bar&site=www.jb51.net&name=nowa+jb51*/

它会自动添加数字索引。

http_build_query 还有一个参数,可以给数字索引加前缀,我们再试试:

$data = array( 'foo', 'bar', 'site'=>'www.jb51.net', 'name'=>'nowa jb51);echo http_build_query;/* outputnm_0=foo&nm_1=bar&site=www.jb51.net&name=nowa+jb51*/

再复杂一些的数组又如何呢?比如二维数组什么的。

$data = array( 'user'=>array('name'=>'Bob Smith', 'age'=>47, 'sex'=>'M', 'dob'=>'5/12/1956'), 'pastimes'=>array('golf', 'opera', 'poker', 'rap'), 'children'=>array('bobby'=>array, 'sally'=>array, 'CEO');

user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M&user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera&pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12&children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8&children%5Bsally%5D%5Bsex%5D=F&0=CEO

为了可读性对其进行了折行:

user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956&pastimes[0]=golf&pastimes[1]=opera&pastimes[2]=poker&pastimes[3]=rap&children[bobby][age]=12&children[bobby][sex]=M&children[sally][age]=8&children[sally][sex]=F&flags_0=CEO

注意:只有基础数组中的数字下标元素“CEO”才获取了前缀,其它数字下标元素则不需要为了合法的变量名而加上前缀。

不只是数组,连对象也能转化为URL字符串:

class myClass { var $foo; var $baz; function myClass() { $this->foo = 'bar'; $this->baz = 'boom'; }}$data = new myClass();echo http_build_query;

末尾,再提几个函数,很可能在你搜索 http_build_query 时需要了解的:

  1. parse_str:将一个url ?后面的参数转换成一个数组,array parse_str。

  2. parse_url:将一个完整的url解析成数组,array parse_url。

  3. http_build_query:再简要解释下,将一个数组转换成url
    ?后面的参数字符串,会自动进行urlencode处理,string http_build_query (
    array formdata [, string
    numeric_prefix]),后面的给数组中没有指定键或者键为数字的加下标。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注