文章教程

12.2.1字符串修剪函数

9/17/2020 9:37:07 PM 人评论 次浏览

12.2 字符串处理函数

PHP提供了上百个字符串处理函数,为字符串的处理提供了强大的支持。为了便于学习,可以将字符串处理函数分为:字符串修剪函数、字符串长度函数、子字符串操作函数、字符串比较函数、字符串连接和分割函数、字符串替换函数、URL处理函数以及其他字符串函数。这些字符串处理函数的共同特征是:至少需要一个字符串类型的数据作为函数的参数,函数对字符串参数的处理并不会改变字符串参数的值和数据类型。

12.2.1 字符串修剪函数

字符串修剪函数包括:字符串裁剪函数、填充字符串函数、将换行符\n或\r替换成HTML换行符<br/>函数、字符串大小写转换函数、在预定义字符前添加或删除反斜线函数、HTML特殊字符处理函数和字符串格式化函数等函数。

1.字符串裁剪函数

字符串裁剪函数包括trim()函数、rtrim()函数和ltrim()函数,这3个函数的语法格式相似。以trim()函数为例,该函数的语法格式为:string trim ( string str)。

函数功能:使用trim()函数可以删除字符串str两边的空格。

说明:这里的空格可以是空格键产生的空格,也可以是Tab键或者回车键产生的空格。使用rtrim()函数时,删除字符串str右边的空格;使用ltrim()函数时,删除字符串str左边的空格。

例如程序trim.php如下。

<?php

$old_string = "\t I am a teacher! \n";

$trimmed = trim($old_string);

var_dump($old_string); //输出:string(21) " I am a teacher! "

echo "<br/>";

var_dump($trimmed); //输出:string(15) "I am a teacher!"

?>

trim()函数适用场景:按某个“关键字”查询新闻内容时,使用该函数将关键字两边的空格剔除;在用户注册或用户登录系统中,使用该函数将用户名两边的空格剔除。

2.填充字符串str_pad()函数

语法格式:string str_pad ( string str, int pad_length [, string pad_string [, int pad_type]] )

函数功能:用填充字符串 pad_string 填充字符串 str ,使得填充后的字符串长度增加到pad_length个字符长度(若没有指定参数pad_string,则用空格填充)。pad_type指定填充的模式,其值可以指定为STR_PAD_RIGHT、STR_PAD_LEFT或STR_PAD_BOTH,表示字符串填充在右侧、左侧或两边,默认为右侧填充。例如,程序str_pad.php如下。

<?php

$string = "abcdefghijklmnopqrstuvwxyz";

$pad_string = "+#";

$pad_both = str_pad($string,30,$pad_string,STR_PAD_BOTH);

$pad_right = str_pad($string,30,$pad_string);

$pad_left = str_pad($string,30,$pad_string,STR_PAD_LEFT);

echo $pad_both; //输出:+#abcdefghijklmnopqrstuvwxyz+#

echo "<br/>";

echo $pad_right; //输出:abcdefghijklmnopqrstuvwxyz+#+#

echo "<br/>";

echo $pad_left; //输出:+#+#abcdefghijklmnopqrstuvwxyz

?>

3.将换行符\n或\r替换成HTML换行符<br/>函数nl2br()

语法格式:string nl2br ( string str )

函数功能:nl2br()函数可以将字符串str中的换行符\n或\r替换成HTML换行符<br/>。

例如,程序nl2br.php如下,该程序的运行结果如图12-4所示。

figure_0279_0358
图12-4 nl2br函数示例程序运行结果

<?php

$old_string = <<<nl2br

I

am

a

t\nea\rcher

!

nl2br;

$new_string = nl2br($old_string);

echo $old_string;

echo "<br/>";

echo $new_string;

?>

nl2br()函数适用场景:在发表新闻评论时,将新闻评论内容中的换行符\n或\r替换成HTML换行符<br/>。

4.字符串大小写转换函数

PHP 提供了 4 个字符串大小写转换的函数,可以将字符串中的字符转换为大写或小写:strtoupper()、strtolower()、ucfirst()和ucwords()。这4个函数的语法格式及功能如表12-2所示。

表12-2 字符串大小写转换函数
figure_0279_0359
figure_0280_0360
续表
figure_0280_0361

例如,程序case.php如下。

<?php

$old_string = "I am a student!";

$strtoupper = strtoupper($old_string);

$strtolower = strtolower($old_string);

$ucfirst = ucfirst($old_string);

$ucwords = ucwords($old_string);

echo $strtoupper; //输出:I AM A STUDENT!

echo "<br/>";

echo $strtolower; //输出:i am a student!

echo "<br/>";

echo $ucfirst; //输出:I am a student!

echo "<br/>";

echo $ucwords; //输出:I Am A Student!

echo "<br/>";

?>

字符串大小写转换函数适用场景:比较两个字符串的内容时,如果不区分两个字符串的大小写,可以将两个字符串全部变为大写或小写后再进行比较。

5.在预定义字符前添加或删除反斜线

(1)addslashes()函数。

语法格式:string addslashes ( string str )

函数功能:在预定义字符前添加反斜线(\),这些预定义字符是:单引号(')、双引号(")和反斜线(\)。例如,程序sql.php如下。

<?php

$name = "";

if(isset($_POST["name"])){

$name = $_POST["name"];

$sql = "select * from users where name='$name'";

echo $sql;

}

?>

<form method="post" action="">

用户名:<input type="text" name="name" value="<?php echo $name;?>">

<input type="submit" value="查询">

</form>

打开浏览器后,在文本框中输入“admin”用户名后单击“查询”按钮,该程序的运行结果如图12-5所示,运行结果中“select * from users where name='admin'”是一条正确的SQL语句,该SQL 语句可以直接在 MySQL 数据库引擎中运行。但若在文本框中输入“admi'n”用户名后单击“查询”按钮,该程序的运行结果如图 12-6 所示,运行结果中,“select * from users wherename='admi'n'”是一条错误的SQL语句,该SQL语句不可以在MySQL数据库引擎中运行。

figure_0281_0362
图12-5 正确的SQL语句
figure_0281_0363
图12-6 “错误”的SQL语句

为了构造一条正确的SQL语句,需要在预定义字符单引号(')前加上反斜线(\)。将sql.php程序代码修改为如下代码(粗体字部分为代码改动部分,其他代码不变)。

<?php

$name = "";

if(isset($_POST["name"])){

$name = addslashes($_POST["name"]);

$sql = "select * from users where name='$name'";

echo $sql;

$name = $_POST["name"];

}

?>

……

此时在文本框中输入“admi'n”用户名后单击“查询”按钮,程序sql.php的运行结果如图12-7所示,运行结果中,“select * from users where name='admi\'n'”是一条正确的SQL语句,该SQL语句可以在MySQL数据库引擎中运行。因此addslashes( )函数的作用就是在$name变量中的预定义字符前加上一个反斜线(\)以便构造一条正确的SQL语句。

figure_0281_0364
图12-7 正确的SQL语句

figure_0281_0365当php.ini的magic_quotes_gpc选项设为On时,修改后的sql.php程序构造的SQL语句为“select * from users where name='admi\\\'n'”,如图12-8所示。原因是当php.ini的magic_quotes_gpc选项设为On时,PHP预处理器会对所有的GET、POST和Cookie中的字符串数据自动使用addslashes()函数处理。

figure_0281_0366
图12-8 “错误”的SQL语句

因此当php.ini的magic_quotes_gpc设为On时,不要对已经被magic_quotes_gpc转义过的字符串使用 addslashes(),否则会导致双重转义。可以使用get_magic_quotes_gpc( )函数判断php.ini配置文件中的magic_quotes_gpc选项设为On还是Off。

addslashes( )函数适用场景:当php.ini的magic_quotes_gpc选项设为Off时,构造一条正确的SQL语句或为了防止SQL注入经常使用addslashes()函数。

(2)stripslashes()函数。

语法格式:string stripslashes ( string str )

函数功能:stripslashes()函数用于删除字符串str中的反斜线,经常用于删除由addslashes()函数添加的反斜线。当PHP配置文件php.ini的选项magic_quotes_gpc设为On时,POST、GET或Cookie 中的特殊字符会自动转义,因此可以使用 stripslashes()函数删除转义符号反斜线。例如,程序stripslashes.php如下。

<?php

if(isset($_POST["name"])){

$name = $_POST["name"];

echo "您输入的信息不是:".$name;

echo "<br/>";

$name = stripslashes($_POST["name"]);

echo "您输入的信息是:".$name;

}

?>

<form method="post" action="">

用户名:<input type="text" name="name" value="输入特殊字符">

<input type="submit" value="查询">

</form>

打开浏览器后,在文本框中输入“O'Neil”用户名后单击“查询”按钮,程序stripslashes.php的运行结果如图12-9所示。

figure_0282_0367
图12-9 stripslashes函数示例程序

addslashes()函数和stripslashes()函数的用法总结如下。

① magic_quotes_gpc选项设置为On 时,尽量不要使用addslashes()函数(防止双重转义)。显示POST、GET或Cookie中的字符串数据时需要使用 stripslashes()函数去掉特殊字符前的转义符号反斜线。

② magic_quotes_gpc 选项设置为 Off 时,使用 POST、GET或Cookie中的字符串进行数据库操作时,必须使用addslashes()函数对POST、GET或Cookie中的字符串进行处理。显示经addslashes()函数处理后的POST、GET或Cookie中字符串数据时,需要使用stripslashes()函数去掉特殊字符前的转义符号反斜线。

6.HTML特殊字符处理函数htmlspecialchars()和strip_tags()

(1)htmlspecialchars()函数。

在HTML和XML中内建了4个预定义实体(如表12-3所示),预定义实体用于表示HTML和XML文档中的特殊字符(注意这些预定义实体必须以“&”开始,以“;”结束),例如HTML或XML预处理器在处理HTML或XML文档时,将自动使用“&gt;”代替“>”,使用“&amp;”代替“&”,以此类推。

表12-3 HTML和XML中4个预定义实体
figure_0282_0368

htmlspecialchars()函数的语法格式:string htmlspecialchars ( string str )

htmlspecialchars()函数的功能:将 PHP 字符串 str 中的特殊字符(如<、&、"、>)转换成对应的预定义实体,以便HTML或XML解析器将预定义实体还原为对应的特殊字符。例如,程序htmlspecialchars.php如下。

<?php

if(isset($_POST["name"])){

$name = $_POST["name"];

$sql = "select * from users where name='$name'";

echo $sql;

}

?>

<form method="post" action="">

用户名:<input type="text" name="name" value="<h1>admin</h1>">

<input type="submit" value="查询">

</form>

打开浏览器后,在文本框中输入“<h1>admin</h1>”后单击“查询”按钮,该程序将字符串“select * from users where name='<h1>admin</h1>'”输出到浏览器,虽然这是一条正确的SQL 语句,但htmlspecialchars.php程序的运行结果有可能违背了软件设计者的初衷,因为浏览器中并没有显示用户输入的数据“<h1>admin</h1>”(如图12-10所示)。将htmlspecialchars.php程序修改为如下代码(粗体字部分为代码改动部分,其他代码不变)。

figure_0283_0369
图12-10 “错误”的显示效果

<?php

if(isset($_POST["name"])){

$name = $_POST["name"];

$name = htmlspecialchars($name);

$sql = "select * from users where name='$name'";

echo $sql;

}

?>

……

再次在文本框中输入“<h1>admin</h1>”用户名并单击“查询”按钮后,程序的运行结果如图12-11所示。此时htmlspecialchars.php程序的输出对应的源文件如下。

figure_0283_0370
图12-11 htmlspecialchars函数示例程序运行结果

select * from users where name='&lt;h1&gt;admin&lt;/h1&gt;'<form method="post" action="">

用户名:<input type="text" name="name" value="<h1>admin</h1>">

<input type="submit" value="查询">

</form>

htmlspecialchars()函数适用场景:当显示 GET 或 POST 提交的字符串数据时,先使用htmlspecialchars()函数对GET或POST字符串数据处理,防止用户提交HTML代码或JavaScript代码破坏系统。

(2)strip_tags()函数。

strip_tags()函数的语法格式:string strip_tags ( string str )

strip_tags()函数的功能:剔除字符串str中的HTML、XML、JavaScript以及PHP的标签。例如,程序strip_tags.php如下。

<?php

if(isset($_POST["name"])){

$name = $_POST["name"];

$name = strip_tags($name);

$sql = "select * from users where name='$name'";

echo $sql;

}

?>

<form method="post" action="">

用户名:<input type="text" name="name" value="<h1>admin</h1>">

<input type="submit" value="查询">

</form>

在文本框中输入“<h1>admin</h1>”用户名时,程序的运行结果如图12-12所示。

figure_0284_0371
图12-12 strip_tags函数示例程序运行结果

该程序的输出对应源文件如下。

select * from users where name='admin'<form method="post" action="">

用户名:<input type="text" name="name" value="<h1>admin</h1>">

<input type="submit" value="查询">

</form>

7.字符串格式化函数

PHP提供了两个字符串格式化函数:sprintf()函数和printf()函数。

(1)sprintf()函数。

语法格式:string sprintf(string format, arg1,arg2,…,argn)

函数功能:sprintf()函数返回字符串 format 格式化后的字符串。字符串参数 format 中包含 n个转换格式(如表12-4所示),每个转换格式以百分号(%)开始;arg1,arg2…,argn的参数值替换参数format中对应的转换格式,即arg1的值替换参数format中第一个转换格式,以此类推, argn的值替换参数format中第n个转换格式。

表12-4 sprintf()函数和printf()函数使用的转换格式
figure_0284_0372
续表
figure_0285_0373

例如,程序sprintf1.php如下,该程序的运行结果如图12-13所示。

figure_0285_0374
图12-13 sprintf函数示例程序运行结果

$formatted = sprintf ("%0.2f", $money); //变量$formatted值为字符串"123.10"

<?php

$arg = "123.0";

$txt =

sprintf("%b<br/>%c<br/>%d<br/>%e<br/>%f<br/>%o<br/>%s<br/>%u<br/>%x<br/>%X<br/>",$arg,$arg,$arg,$arg,$arg,$arg,$arg,$arg,$arg,$arg);

echo $txt;

?>

程序sprintf1.php也可以修改为如下代码(粗体字部分为代码改动部分)。

<?php

$arg = "123.0";

$txt =

sprintf("%1\$b<br/>%1\$c<br/>%1\$d<br/>%1\$e<br/>%1\$f<br/>%1\$o<br/>%1\$s<br/>%1\$u<br/>%1\$x<br/>%1\$X<br/>",$arg);

echo $txt;

?>

修改后的 sprintf1.php 程序说明:百分号(%)与转换格式之间可以使用占位符,占位符必须由数字和“\$”组成。此时程序sprintf1.php中“1\$”为占位符,表示使用第一个参数$arg的值,并将该参数值格式化为二进制数、ASCII字符等。

例如,程序sprintf2.php如下。

<?php

$money1 = 68.75;

$money2 = 54.35;

$money = $money1 + $money2; //此时变量$money值为数值123.1

echo $formatted; //输出:123.10

?>

程序 sprintf2.php说明:百分号(%)与转换格式之间也可以指定小数点后的位数,0.2 表示转换后的浮点数中,小数点后保留两位(0.2中的0可以省略不写)。

(2)printf()函数。

语法格式:int printf(string format, arg1,arg2,…,argn)

函数功能:将字符串参数format格式化后的字符串值打印到浏览器页面上,该函数返回格式化后字符串的长度。例如程序printf.php如下。

<?php

$money1 = 68.75;

$money2 = 54.35;

$money = $money1 + $money2; //此时变量$money值为数值123.1

$length = printf ("%1\$0.2f", $money); //输出:123.10

echo "<br/>";

echo $length; //输出:6

?>

12.2.2 字符串长度函数

字符串长度函数包括strlen()函数和mb_strlen()函数等函数。

1.strlen()函数

语法格式:int strlen ( string str )

函数功能:返回字符串string的字节长度。例如程序strlen.php如下。

<?php

$content = "admin管理员";

echo strlen($content); //输出:11

?>

注意:记事本文件默认使用ANSI编码,对于ANSI编码方式的PHP文件,一个英文字符占用一个字节长度,一个中文字符占用两个字节长度;对于 UTF-8 编码方式的 PHP 文件,一个英文字符占用一个字节长度,而一个中文字符则占用3个字节长度。因此若将strlen.php程序使用如下步骤将编码方式修改为UTF-8编码方式时,程序strlen.php的运行结果将会发生相应的改变。

(1)使用记事本打开程序strlen.php。

(2)单击“文件”菜单,选择“另存为”选项,在编码下拉选择框中选择UTF-8编码方式。

figure_0286_0375
图12-14 UTF-8编码方式

(3)单击“保存”按钮后,使用浏览器重新访问程序strlen.php,程序strlen.php的运行结果如图12-14所示。

figure_0286_0376开发中文的网站时,采用统一且规范的文件编码方式是避免中文乱码问题出现的最基本的解决方案,建议PHP程序文件统一采用ANSI编码方式,并且Windows操作系统默认的编码方式为ANSI编码方式,本书涉及的程序文件,若不作说明,采用的是ANSI编码方式。

2.mb_strlen()函数

语法格式:int mb_strlen ( string str [, string encoding])

函数功能:和strlen()函数功能大致相同,区别是mb_strlen()函数可以设置encoding编码方式解析字符串str。若将encoding的值设为“GBK”或“gb2312”,则使用中文编码方式解析字符串str(将一个汉字按照两个字节进行解析)。

说明:使用 mb_strlen()函数时,必须确保将 php.ini 配置文件中配置选项“;extension=php_mbstring.dll”前面的“;”去掉。

例如程序mb_strlen.php如下,该程序的运行结果如图12-15所示。

figure_0287_0377
图12-15 mb_strlen函数示例程序

<?php

$content = "admin管理员";

echo mb_strlen($content,"gbk");

?>

若将mb_strlen.php程序文件修改为UTF-8编码方式后,程序的运行结果会发生相应的改变,如图12-16所示。

figure_0287_0378
图12-16 UTF-8编码方式

产生这种结果的原因是,程序文件使用UTF-8编码方式(一个英文字符占用一个字节长度,而一个中文字符则占用3个字节长度),而PHP使用GBK编码方式解析$content字符串(将一个汉字按照两个字节进行解析)。因此当mb_strlen.php程序文件修改为UTF-8编码方式时,相应的mb_strlen.php程序也应该进行如下调整,此时程序mb_strlen.php的运行结果如图12-15所示。

<?php

$content = "admin管理员";

echo mb_strlen($content,"utf-8");

?>

从上面的例子可以看出,mb_strlen()函数的参数encoding的值为GBK时,mb_strlen()函数将字符串str中的每个中文字符按照两个字节的长度进行解析。

figure_0287_0379可以在php.ini配置文件中配置mb_strlen()函数的默认编码方式encoding(其他的mb_函数类似),将php.ini文件中的配置选项“;mbstring.internal_encoding = EUC-JP”修改为“mbstring.internal_encoding = GBK”,重启Apache服务器后,再使用mb_strlen()函数时,编码方式encoding参数的默认值为GBK。

12.2.3 子字符串操作函数

子字符串操作函数包括:取出指定位置的子字符串函数、在字符串中查找指定子字符串的位置函数、取出字符串中指定子串的剩余字符串函数和计算子字符串出现的频率函数等。

1.取出指定位置的子字符串

(1)substr()函数。

语法格式:string substr ( string str, int start [, int length] )

函数功能:返回str字符串中位于start索引和start+length索引之间的子字符串。若没有指定length参数,则返回从start索引到str字符串末尾的子字符串。

说明:start和length的值为负数时,意味着按从右(-1)到左的顺序计算字符串索引。

例如程序substr.php如下。

<?php

$string = 'abcdef';

echo substr($string,1); //输出: bcdef

echo "<br/>";

echo substr($string,1,3); //输出: bcd

echo "<br/>";

echo substr($string,0,4); //输出: abcd

echo "<br/>";

echo substr($string,0,8); //输出: abcdef

echo "<br/>";

echo substr($string,-1,1); //输出: f

?>

例如,程序substr_wrong.php如下。该程序在IE浏览器中的运行结果如图12-17所示,在Firefox浏览器中的运行结果如图12-18所示。

figure_0288_0380
图12-17 substr函数示例程序运行结果
figure_0288_0381
图12-18 substr函数示例程序运行结果

<?php

$string = 'testing这是一个长字符串,仅显示其中一部分!';

echo substr($string,0,10);

echo "<br/>";

echo substr($string,0,11);

?>

可以看到,使用 substr()函数从中文字符串中取子串时,有可能导致乱码问题的产生。使用mb_substr()或mb_strcut()函数可以解决从中文字符串中取子串时可能产生的乱码问题。

(2)mb_substr()函数。

语法格式:string mb_substr ( string str, int start [, int length [, string encoding]] )

函数功能:和 substr()函数功能大致相同,区别是mb_substr()函数可以设置encoding编码方式解析字符串str。例如程序 mb_substr.php,该程序在 IE 浏览器中的运行结果如图12-19所示(在Firefox浏览器的运行结果与在IE浏览器中的运行结果相同)。

figure_0288_0382
图12-19 mb_substr函数示例程序运行结果

<?php

$string = 'testing这是一个长字符串,仅显示其中一部分!';

echo mb_substr($string,0,10,"gbk");

echo "<br/>";

echo mb_substr($string,0,11,"gbk");

?>

如果 php.ini 配置文件中 mbstring.internal_encoding 选项的值是 GBK ,此时可以将程序mb_substr.php的代码修改为如下代码。

<?php

$string = 'testing这是一个长字符串,仅显示其中一部分!';

echo mb_substr($string,0,10);

echo "<br/>";

echo mb_substr($string,0,11);

?>

从程序 mb_substr.php 的运行结果可以看出,mb_substr()函数的参数 encoding的值为 GBK时,mb_substr()函数将字符串str中的每个中文字符按照占用两个字节的长度进行解析,解析时多余的一个字节将舍去,从而避免中文乱码问题的产生。

(3)mb_strcut()函数。

语法格式:string mb_strcut ( string str, int start [, int length [, string encoding]] )

函数功能:和mb_substr()函数功能大致相同,区别是mb_strcut()函数将字符串中的每个字符按照1个字节长度解析,对于占用两个字节的中文汉字,截取时多余的一个字节将舍去,从而避免中文乱码问题的发生。例如,程序mb_strcut.php如下,该程序的运行结果如图12-20所示。

figure_0289_0383
图12-20 mb_strcut函数示例程序

<?php

$string = 'testing这是一个长字符串,仅显示其中一部分!';

echo mb_strcut($string,0,10,"gbk");

echo "<br/>";

echo mb_strcut($string,0,11,"gbk");

?>

mb_strcut()函数默认编码方式为GBK,如果php.ini配置文件中mbstring.internal_encoding选项的值是GBK,此时可以将程序mb_strcut.php代码修改为如下代码。

<?php

$string = 'testing这是一个长字符串,仅显示其中一部分!';

echo mb_strcut($string,0,10);

echo "<br/>";

echo mb_strcut($string,0,11);

?>

mb_strcut()函数适用场景:在新闻发布系统中,新闻列表中一般仅仅显示新闻的标题,并且为了提高页面的美观程度,新闻标题过长时只显示标题的前半部分内容。

2.在字符串中查找指定子字符串的位置

(1)strpos()函数。

语法格式:int strpos(string str,string substr[,int offset])

函数功能:在字符串str中以区分大小写的方式查找字符串substr第一次出现的索引,若substr不在str中,则函数返回FALSE。可选参数offset用于指定函数从str哪个索引位置开始查找。

(2)strrpos()函数。

语法格式:int strrpos(string str,string substr[,int offset])

函数功能:在字符串str中以区分大小写的方式查找字符串substr最后一次出现的位置,若substr不在str中,则函数返回FALSE。可选参数offset用于指定函数从str哪个索引位置开始查找。

例如,程序strpos.php如下。

<?php

$test = "testing这是一个长字符串,仅显示其中一部分!";

echo strpos($test, "一"); //输出:11

echo "<br/>";

echo strrpos($test, "一"); //输出:35

?>

(3)mb_strpos()函数。

语法格式:int mb_strpos(string str,string substr [, int offset [, string encoding]])

函数功能:和 strpos()函数功能大致相同,区别是 mb_strpos()函数可以设置用 encoding 编码方式解析字符串str。

(4)mb_strrpos()函数。

语法格式:int mb_strrpos(string str,string substr [, int offset [, string encoding]])

函数功能:和strrpos()函数功能大致相同,区别是mb_strrpos()函数可以设置encoding编码方式解析字符串str。

例如,程序mb_strpos.php如下。

<?php

$test = "testing这是一个长字符串,仅显示其中一部分!";

echo mb_strpos($test, "一",0,"gbk"); //输出:9

echo "<br/>";

echo mb_strrpos($test, "一",0,"gbk"); //输出:21

?>

3.取出字符串中指定子串的剩余字符串

(1)strstr()函数。

语法格式:string strstr(string str,string substr)

函数功能:在字符串str中取出从substr字符串开始的剩余子串,若string字符串中没有substr子串,函数返回FALSE。

说明:该函数区分大小写,该函数的别名函数是strchr()函数。

例如程序strstr.php如下。

<?php

$email = 'admin@sina.com';

$domain = strstr($email, '@sina');

echo $domain; //输出:@sina.com

?>

(2)stristr()函数。

语法格式:string stristr(string str,string substr)

函数功能:在字符串str中取出从substr字符串开始的剩余子串,若string字符串中没有substr子串,函数返回FALSE。

说明:该函数不区分大小写。

例如,程序stristr.php如下。

<?php

$email = 'admin@sina.com';

$domain = stristr($email, '@SINA');

echo $domain; //输出:@sina.com

?>

4.计算子字符串出现的频率

(1)substr_count()函数。

语法格式:int substr_count ( string str, string substr)

函数功能:返回字符串str中出现子字符串substr的次数。例如,程序substr_count.php如下。

<?php

$text = 'This is a test';

echo substr_count($text, 'is'); //输出:2

?>

(2)mb_substr_count()函数。

语法格式:int mb_substr_count ( string str, string substring [, string encoding] )

函数功能:和 substr_count()函数功能大致相同,区别是 mb_substr_count()函数可以设置encoding编码方式解析字符串str。例如,程序mb_substr_count.php如下。

<?php

$text = 'testing这是一个长字符串,仅显示其中一部分!';

echo mb_substr_count($text, '一',"gbk"); //输出:2

?>

12.2.4 字符串比较函数

字符串比较函数包括strcmp()函数和strcasecmp()函数等函数。

1.strcmp()函数

语法格式:int strcmp ( string str1, string str2 )

函数功能:以区分大小写的方式比较字符串str1和字符串str2。若两个字符串相等,函数返回0;若字符串str1大于字符串str2,函数返回大于0的整数;若字符串str1小于字符串str2,函数返回小于0的整数;

注意:字符串比较函数中的参数若不是字符串数据类型,PHP会将该参数自动转换为字符串数据类型再进行比较。例如如下程序 strcmp1.php 演示了strcmp()函数和“= =”比较字符串时的区别,该程序的运行结果如图12-21所示。

figure_0291_0384
图12-21 strcmp函数示例程序运行结果

<?php

$password1 = 11;

$password2 = "11a";

if(strcmp($password1,$password2)==0){

echo "使用strcmp()函数比较两次输入的密码相等!";

}else{

echo "使用strcmp()函数比较两次输入的密码不相等!";

}

echo "<br/>";

if($password1==$password2){

echo "使用==比较两次输入的密码相等!";

}else{

echo "使用==比较两次输入的密码不相等!";

}

?>

如下程序strcmp2.php演示了strcmp()函数和“= = =”比较字符串时的区别,该程序的运行结果如图12-22所示。

figure_0292_0385
图12-22 strcmp函数和= = =的区别

<?php

$password1 = 11;

$password2 = "11";

if(strcmp($password1,$password2)==0){

echo "使用strcmp()函数比较两次输入的密码相等!";

}else{

echo "使用strcmp()函数比较两次输入的密码不相等!";

}

echo "<br/>";

if($password1===$password2){

echo "使用===比较两次输入的密码相等!";

}else{

echo "使用===比较两次输入的密码不相等!";

}

?>

2.strcasecmp()函数

语法格式:int strcmp ( string str1, string str2 )

函数功能:以不区分大小写的方式比较字符串str1和字符串str2。若两个字符串相等,函数返回0;若字符串str1大于字符串str2,函数返回大于0的整数;若字符串str1小于字符串str2,函数返回小于0的整数。例如,如下程序strcasecmp.php比较两个Email地址(不区分大小写),该程序的运行结果如图12-23所示。

figure_0292_0386
图12-23 strcasecmp函数示例程序

<?php

$email1 = "admin@163.com";

$email2 = "Admin@163.com";

if(strcasecmp($email1,$email2)==0){

echo "两次输入的Email地址相等!";

}else{

echo "两次输入的Email地址不相等!";

}

?>

12.2.5 字符串连接和分割函数

字符串格连接和分割函数包括:implode()函数和strtok()函数。

1.implode()函数

语法格式:string implode (string glue, array arr)

函数功能:使用字符串glue将数组arr中的元素连接成一个新字符串。implode()函数实现了explode()函数相反的功能。例如,程序implode.php如下。

<?php

$products = array('127','0','0','1');

$new_string = implode(".",$products);

echo $new_string; //输出:127.0.0.1

?>

2.strtok()函数

语法格式:string strtok (string str, string separator)

函数功能:使用字符串separator对字符串str进行一次分割,若要进行多次分割,需要连续调用该函数。

函数说明:在第一次调用 strtok()函数时,需指定 str参数;在以后的调用过程中,不需要指定str参数字符串。

例如,程序strtok.php如下,该程序的运行结果如图12-24所示。

figure_0293_0387
图12-24 strtok函数示例程序

<?php

$string = "This is\tan example\nstring";

$tok = strtok($string, "\n \t"); //使用“\n或空格或\t”分割$string

while($tok){

echo "Word=$tok<br/>";

$tok = strtok("\n \t"); //虽然没有指定$string参数,继续使用“\n或空格或\t”分割$string

}

?>

12.2.6 字符串替换函数

字符串替换函数包括 str_replace()函数函数、str_ireplace()函数、substr_replace()函数和 strtr()函数等函数。

1.str_replace()函数

语法格式:mixed str_replace(mixed search, mixed replacement, mixed str)

函数功能:以区分大小写的方式将字符串 str 中的search字符串替换成字符串replacement。例如,如下程序 str_replace.php 将字符串"Hello world"中的字符串"o"变斜加粗,该程序的运行结果如图12-25所示。

figure_0293_0388
图12-25 str_replace函数示例程序运行结果

<?php

$string = "Hello world";

$occurrence = "o";

$replacement = "<i><b>o</b></i>";

$new_string = str_replace($occurrence,$replacement,$string);

echo $new_string;

?>

PHP 提供的 str_ireplace()函数功能与 str_replace()函数相同,只是 str_ireplace()函数不区分大小写。str_replace()函数适用场景:新闻发布系统中按关键字模糊查询新闻时,可以将新闻标题或新闻内容中所有查询关键字加粗显示以便醒目。

2.substr_replace()函数

语法格式:mixed substr_replace ( mixed str, string replacement, int start [, int length] )

函数功能:将字符串 str 中 start 位置和 start+length 位置之间的字符串替换成字符串replacement,若没有指定length参数,则替换从start到string字符串末尾的字符串。

函数说明:start和length的值为负数时,意味着按从右(从-1开始)到左的顺序计算索引。

例如,程序substr_replace.php如下。

<?php

$string = "abcdefghijklmnopqrstuvwxyz";

$replacement = ".....";

$new_string1 = substr_replace($string,$replacement,12);

echo $new_string1; //输出:abcdefghijkl.....

echo "<br/>";

$new_string2 = substr_replace($string,$replacement,-12);

echo $new_string2; //输出:abcdefghijklmn.....

?>

3.strtr()函数

语法格式:string strtr(string str,array replacements)

函数功能:将字符串 str 中的所有字符串转换为数组 replacements 中的相应值。例如,程序strtr.php如下,该程序的运行结果如图12-26所示,运行结果的源文件如图12-27所示。

figure_0294_0389
图12-26 strtr函数示例程序运行结果
figure_0294_0390
图12-27 源文件

<?php

$replacements = array("<b>"=>"<strong><i>","</b>"=>"</strong></i>");

$html = "<b>I'm a teacher.</b>";

$new_html = strtr($html,$replacements);

echo $new_html;

?>

12.2.7 URL处理函数

URL是一个特殊的字符串,PHP提供了一些URL处理函数,主要包括:解析URL字符串函数、URL转义处理函数和构造查询字符串函数。

1.解析URL字符串

(1)parse_url()函数。

语法格式:array parse_url ( string url )

函数功能:解析URL字符串,以数组方式返回URL组成部分,包括协议名scheme、主机名host、端口号port、用户名user、密码pass、路径path、程序字符串query以及片段fragment。

(2)parse_str()函数。

语法格式:void parse_str ( string query_string)

函数功能:将查询字符串 query_string 中所有的“参数名=参数值”解析为变量(参数名为变量名,值为参数值)。

例如,如下程序url.php演示了parse_url()函数和 parse_str()函数的用法,该程序的运行结果如图12-28所示。

figure_0295_0391
图12-28 解析URL字符串

<?php

$url = "http://nobody:secret@example.com:80/script.php?var1=value1&var2=value2# anchor";

$parse_url = parse_url($url);

var_dump($parse_url);

$query_string = $parse_url["query"];

parse_str($query_string);

echo "<br/>";

echo $var1;

echo "<br/>";

echo $var2;

?>

2.URL转义处理

使用GET提交方式传递参数时,GET提交方式是将“请求”数据以查询字符串(Query String)的方式附在 URL 之后“提交”数据的,“?”定义了查询字符串的开始,“=”用于用于连接查询字符串中的“参数名”和“参数值”,“&”用于分隔查询字符串中的“参数名=参数值”,并且查询字符串中间不允许有空格字符存在,这4个字符是GET提交方式的特殊字符。另外还有“#”、“%”、“+”和“\”都是查询字符串的特殊字符(如表12-5表示)。

表12-5 URL中的特殊字符
figure_0295_0392

这些特殊字符在URL中有着特殊的含义,如果查询字符串中某个“参数值”中包含有URL特殊字符,使用 PHP 的$_GET 数组取得“参数值”时将出现不可预知的结果。例如,程序specialurl.php如下。

<?php

if(isset($_GET["filename"])){

$filename = $_GET["filename"];

echo $filename;

echo "<br/>";

}

?>

<a href="?filename=<?php echo

'a?b%c+d\e&f=g#h .doc'?>">下载文件</a>

“下载文件”超链接的查询字符串中包含了所有的特殊字符,单击了该超链接后程序specialurl.php的运行结果如图12-29所示。

figure_0296_0393
图12-29 URL转义处理

从程序specialurl.php的运行结果可以看出以下两点。

① 如果查询字符串中存在特殊字符,使用PHP的$_GET数组有可能无法正常获取“参数值”。

② 程序 specialurl.php 运行后的浏览器地址栏中,只有空格字符发生了转义(被转义为%20)。

如果将程序specialurl.php中查询字符串中的所有特殊字符替换成对应的转义字符(或序列),程序specialurl.php修改为如下代码(粗体字部分为代码改动部分)。

<?php

if(isset($_GET["filename"])){

$filename = $_GET["filename"];

echo $filename;

echo "<br/>";

}

?>

<a href="?filename=<?php echo

'a%3Fb%25c%2Bd%2Fe%26f%3Dg%23h%20.doc'?>">下载文件</a>

此时单击specialurl.php页面的超链接后,程序specialurl.php的运行结果如图12-30所示。

figure_0296_0394
图12-30 URL转义处理

从修改后的specialurl.php程序的运行结果可以看出,如果查询字符串中“参数值”中包含了特殊字符,需要将特殊字符“转义”为字符序列,以便使用$_GET数组正常解析“参数值”。PHP提供的URL转义处理函数urlencode()和rawurlencode()可以将查询字符串中的特殊字符“转义”为对应的转义字符(或序列)。

(1)urlencode()函数。

语法格式:string urlencode ( string str )

函数功能:将查询字符串str中的特殊字符转义。

urlencode()函数使用场景:使用GET提交方式提交数据时,经常使用该函数将查询字符串的特殊字符转义。

如下程序 urlencode.php 的功能是下载文件名为“div+css%D6%D0 %CE%C4.doc”(文件名中有两个空格)的 Word 文档,单击程序 urlencode.php 运行结果中的“下载文件”超链接后, urlencode.php程序的运行结果如图12-31所示。

figure_0297_0395
图12-31 URL转义处理

<?php

if(isset($_GET["filename"])){

$filename = $_GET["filename"];

echo $filename;

echo "<br/>";

}

?>

<a href="?filename=<?php echo 'div+css%D6%D0 %CE%C4.doc';?>">下载文件</a>

此时下载的文件名不再是“div+css%D6%D0 %CE%C4.doc”,而变成了“div css中 文.doc”,由于WEB服务器中存在的是“div+css%D6%D0 %CE%C4.doc”文件,而“div css中 文.doc”文件不存在,从而导致文件下载失败。该程序模拟了新闻发布系统中文件下载功能的一处 bug。细心的读者可能发现,程序urlencode.php运行后的浏览器地址栏中的地址变为“http://localhost/12/urlencode.php?filename=div+css%D6%D0%20%20%CE%C4.doc”,即将文件名“div+css%D6%D0 %CE%C4.doc”中的每个空格解析为“%20”。

为了避免产生bug,需要借助urlencode()函数将查询字符串“参数值”进行“转义”以便PHP的$_GET数组能够得到文件下载功能的正确文件名。将程序urlencode.php修改为如下代码(粗体字部分为代码改动部分)。

<?php

if(isset($_GET["filename"])){

$filename = $_GET["filename"];

echo $filename;

echo "<br/>";

}

?>

<a href="?filename=<?php echo urlencode('div+css%D6%D0 %CE%C4.doc');?>">下载文件</a>

此时单击程序urlencode.php运行结果中的“下载文件”超链接后,urlencode.php程序的运行结果如图12-32所示,程序urlencode.php的查询字符串通过urlencode()函数“转义”,确保了文件下载的成功。

figure_0297_0396
图12-32 urlencode函数示例程序运行结果

细心的读者可能发现,程序 urlencode.php 运行后的浏览器地址栏中的地址变为“http://localhost/12/urlencode.php?filename=div%2Bcss%25D6%25D0++%25CE%25C4.doc”,其中原因请读者自己分析。

(2)urldecode()函数。

语法格式:void urldecode ( string str )

函数功能:用于将urlencode() 函数“编码”后的字符串str“解码”。

说明:由于浏览器会自动将 urldecode()函数转义后的字符串进行 urldecode()处理,因此一般不使用urldecode()函数,除非字符串str做了两次urlencode()处理。

(3)rawurlencode()函数。

语法格式:string rawurlencode( string str )

函数功能:和urlencode()函数功能大致相同。

如下程序rawurlencode.php演示了rawurlencode()函数和urlencode()函数之间的区别。

<?php

if(isset($_GET["filename"])){

$filename = $_GET["filename"];

echo $filename;

echo "<br/>";

}

?>

<a href="?filename=<?php echo rawurlencode('div+css%D6%D0 %CE%C4.doc');?>">下载文件</a>

单击程序rawurlencode.php运行结果中的“下载文件”超链接后,rawurlencode.php程序的运行结果如图12-33所示。

figure_0298_0397
图12-33 rawurlencode函数示例程序运行结果

程序rawurlencode.php与程序urlencode.php的运行结果不同之处在于:程序urlencode.php运行结果浏览器地址栏中的地址为“http://localhost/12/urlencode.php?filename=div%2Bcss%25D6%25D0++%25CE%25C4.doc”,程序 rawurlencode.php 运行结果浏览器地址栏中的地址为“http://localhost/12/rawurlencode. php?filename=div%2Bcss%25D6%25D0%20%20%25CE%25C4.doc”。

通过比较两个程序运行结果地址栏中的地址可以看出,使用urlencode()函数时,该函数将空格字符转义为“+”字符;使用rawurlencode ()函数时,该函数将空格字符转义为“%20”字符序列。

(4)rawurldecode ()函数。

语法格式:void rawurldecode ( string str )

函数功能:用于将rawurlencode() 函数“编码”后的字符串str“解码”。

说明:由于浏览器会自动将rawurlencode() 函数转义后的字符串进行rawurldecode()处理,因此一般不使用rawurldecode ()函数,除非字符串str做了两次rawurlencode ()处理。

3.构造查询字符串http_build_query()函数

语法格式:string http_build_query ( array formdata [, string prefix] )

函数功能: 将数组formdata转换成查询字符串,查询字符串中的“参数名”来自于数组元素的“键名”,查询字符串中的“参数值”来自于数组元素中的“值”。字符串prefix用于指定查询字符串中数字键的前缀。例如程序http_build_query.php如下。

<?php

$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');

echo http_build_query($data);

echo "<br/>";

echo http_build_query($data, 'myvar_');

?>

程序http_build_query.php的运行结果如图12-34所示。

figure_0299_0398
图12-34 http_build_query函数示例程序运行结果

12.2.8 其他常用的字符串函数

1.strrev()函数

语法格式:string strrev(string str)

函数功能:将英文字符串str颠倒过来。例如,程序strrev1.php如下。

<?php

echo strrev("Hello world!"); // 输出"!dlrow olleH"

?>

注意:strrev()函数不能将中文字符串颠倒过来,否则有可能出现乱码问题。例如,程序strrev2.php如下,运行结果如图12-35所示。

<?php

echo strrev("你好,世界!");

?>

若要将中文字符串颠倒过来,可以参考如下程序strrev_right.php。

<?php

$str = "你好,世界!";

$len = mb_strlen("$str");

$new_string = "";

for ($i=$len;$i>=0;$i--){

$new_string .= mb_substr($str,$i,1,'gbk');

}

echo $new_string;

?>

程序strrev_right.php中使用了mb_strlen()函数、mb_substr()函数,并结合for循环演示了颠倒中文字符串的方法。程序strrev_right.php的运行结果如图12-36所示。

2.str_repeat()函数

语法格式:string str_repeat(string str, int times)

figure_0300_0399
图12-35 不能将中文字符串颠倒过来
figure_0300_0400
图12-36 将中文字符串颠倒过来

函数功能:重复字符串str指定的times次数。例如程序str_repeat.php如下。

<?php

echo str_repeat("+#", 10); //输出:+#+#+#+#+#+#+#+#+#+#

?>

3.mb_convert_encoding()函数

语法格式:string mb_convert_encoding (string str, string to_encoding [, mixed from_encoding] )

函数功能:将字符串str从from_encoding编码方式转换成to_encoding。

例如,如下程序gbk_to_utf.php将字符串“你是我的好朋友”从GBK编码转换成UTF-8编码。

<?php

header("content-Type: text/html; charset=utf-8");

echo mb_convert_encoding("你是我的好朋友", "UTF-8", "GBK");

?>

教程类别