11.1 字符串的处理介绍
11.1.1 字符串的处理方式
C语言中,字符串是作为字节数组处理的,在Java语言中,字符串是作为对象处理,而PHP中则把字符串作为一种基本的数据类型来处理。
但对一些比较复杂的字符串操作,则需要借助PHP所支持的正则表达式来实现。
11.1.2字符串类型的特点
PHP是弱类型语言,所以其他类型的数据一般都可以直接用于字符串操作函数里,而自动转换成字符串类型进行处理。
<?php
echo substr("1234567",2,4)."<br>";
echo substr(1234567,2,4);
echo hello;
?>
<?php
$str="lamp";
echo $str."<br>";
echo $str[0];
echo $str[1];
echo $str[2];
echo $str[3]."<br>";
echo $str[0].$str[1];
?>
但将字符串看作字符集合时,并不是真的数组,不能使用数组的处理函数操作。由于PHP脚本引擎对于中括号方法可能会带来二义性,自PHP4起已过时,代替它的是使用花括号,为了向下兼容,仍然可以使用方括号。
<?php
$str="lamp";
echo $str{0};
echo $str{1};
echo $str{2};
echo $str{3}."<br>";
echo $str{0}.$str{1};
$last=$str{strlen($str)-1};
$str{strlen($str)-1}='e';
$str{1}="nginx";//如果使用一个字符串去修改另一个字符串中的第2个字符,则结果为lnme(只修改第二个首字母,而且之前已经改过最后一位)
?>
11.1.3 双引号中变量解析总结
<?php
$lamp=array('os'=>'Linux','webserver'=>'Apache','db'=>'MySQL','language'=>'php');
echo "A OS is $lamp[os]"; //可以解析,双引号对于数组索引
echo "A OS is $lamp['os']"; //不能解析,如果在关联数组下标使用引号就必须使用花括号
echo "A OS is {$lamp['os']}"; //可以解析,如果在对关联数组下标使用引号就必须使用花括号,否则将出错
echo "A OS is {$lamp[os]}"; //可以解析,但是PHP将数组下标看成常量名,并且当不存在时将变量名转换为字符中,效率低
echo "This square is $square->width meters broad.";
echo "This square is $square->width00 centimeters broad."; //不能解析,可以用花括号解决
echo "This square is {$square->width}00 centimeters broad."; //可以解析
?>
11.2 常用的字符串输出函数
1. 函数echo()
该函数用于输出一个或多个字符串,是在PHP中使用最多的函数。不过如果希望向echo()传递一个或多个参数,那么使用括号会发生解析错误。
void echo (string arg1[,string...])
2. 函数print()
该函数的功能和echo()的一样,它有返回值,若成功则返回1,失败则返回0。
3. 函数die()
该函数是exit()函数的别名。如果参数是一个字符串,则该函数就会在退出前输出它,如果参数是整数,则会被作为退出状态(状态0为退出)。
<?php
$url="http://www.baidu.com";
fopen($url,"r") or die("Unable to connect to $url"); //如果打开失败则输出一条消息并退出程序
?>
4. 函数printf()
该函数用于输出格式化的字符串,和C语言中的同名函数用法一样。
printf(format,arg1,arg2,...,argn)
5. 函数sprintf()
该函数的用法和printf()相似,但它不是输出字符串,而是把格式化的字符串以返回值的形式写入到一个变量中,这样就可以在需要的时候使用格式化后的字符串。
<?php
$num=12345;
$txt=sprintf("%0.2f",$num);
echo $txt;
?>
111.3 常用的字符串格式化函数
字符串格式化就是将字符串处理为某种特定的格式。
11.3.1 去除空格和字符串填补函数
PHP中通过ltrim()、rtrim()和trim()函数完成工作。
string ltrim (string str[, string charlist])//从字符串左侧删除空格或其他预定义字符
string rtrim (string str[, string charlist])//从字符串右侧删除空白字符或其他预定义字符
string trim (string str[, string charlist])//从字符串的两端删除空白字符和其他预定义字符
处理后的结果都会以心字符串形式返回,不会在原字符串上修改。第一个参数为str待处理的字符串,而第二个参数charlist为过滤字符串,用于指定希望去除的特殊符号。如果不指定过滤字符串,默认情况下会去掉下列字符:
” “:ASCII为32的字符,即空格
“\0”:ASCII为0的字符,即NULL
“\t”:ASCII为9的字符,即制表符Tab
“\n”:ASCII为10的字符,即新行
“\r”:ASCII为13的字符,即回车
11.3.2 字符串大小写的转换
函数strtoupper()用于将给定的字符串全部转换为大写字母;
函数strtolower()用于将给定的字符串全部转换为小写字母;
函数ucfirst()用于将给定的字符串中的首字母转换为大写,其余字符不变;
函数ucwords()用于将给定的字符串中全部以空格分隔的单词首字母转换为大写。
这些函数只是按照它们说明中描述的工作方式,要想确保一个字符串的首字母是大写字母,而其余的都是小写字母,就需要使用复合的方式——
<?php
$lamp="lamp is composed of Linux、Apache、MySQL and PHP";
echo ucfirst(strtolower($lamp));
?>
11.3.3 和HTML标签相关的字符串格式化
1. 函数nl2br()
nl2br()函数就是在字符串中的每个新行\n
之前插入HTML换行符<br />
。
2. 函数htmlspecialchars()
string htmlspecialchars(string string[,int quote_style[,string charset]])
PHP中提供的htmlspecialchars()函数就可以将一些预定义的字符串转换为HTML实体。
&
转换为&
"
转换为"
'
转换为'
<
转换为<
>
转换为>
在PHP中还提供了htmlentities()函数,可以将所有的非ASCII码字符转换为对应的实体代码。
函数stripslasher()的功能是去掉反斜线“\”,如果有连续两个反斜线,则只去掉一个。与之对应的是另一个函数addslasher()。
函数htmlspacialchars()是将HTML中的标记符号转换为对应的HTML实体,有时直接删除用户输入的HTML标签,也是非常有必要的。
PHP中提供的strip_tags()函数默认就可以删除字符串中所有的HTML标签,也可以选择性地删除一些HTML标记。
string strip_tags(string str,[string allowable_tags])
第一个参数提供了要处理的字符串,第二个参数是一个可选的HTML标签列表,放入该列表的HTML标签将被保留。
11.3.4 其他字符串格式化函数
1. 函数strrev()
该函数的作用是将输入的字符反转,只提供一个要处理的字符串作为参数,返回反转后的字符串如下:
<?php
echo strrev("http://www.lampbrother.net"); //反转后输出:ten.rehtorbpmal.www//:ptth
2. 函数number_format()
number_format()函数通过千位分组来格式化数字
string number_format(float number[,int decimals[,string dec_point,string thousands_sep]])
3. 函数md5()
md5()函数的作用就是将一个字符串进行MD5算法加密,默认返回一个32位的十六进制字符串。
string md5(string str[,bool raw_output]) //进行MD5算法加密演算
11.4 字符串比较函数
11.4.1 按字节顺序进行字符串比较
要按字节顺序进行字符串的比较,可以使用strcmp()和strcasecmp()两个函数,其中函数strcasecmp()可以忽略字符串中字母的大小写进行比较。
int strcmp(string str1,string str2)
int strcasecmp(string str1,string str2)
如果str1等于str2则返回0
如果str1大于str2则返回1
如果str1小于str2则返回-1
11.4.2 按自然排序进行字符串比较
使用strnatcmp()函数按自然排序法比较两个字符串,该函数对大小写敏感, 其使用格式与strcmp()函数相似。
在PHP中也提供了这个函数的忽略大小写版本的函数strnatcasecmp()用法和strnatcmp()函数相同。