前言
字符串几乎在所有编程语言都存在的一种数据类型,也是PHP中最重要的一种数据类型之一,更是日常开发中使用最多的一种数据类型。在web开发中,很多情况下需要对字符串进行处理和分析,这通常涉及字符串的格式化、连接与分割,比较、查找,翻转等等一系列操作。用户和系统的交互也基本上是通过文字来进行的,所以系统对文本信息,即字符的处理非常重视。在PHP的项目开发中有30%以上的代码在操作或处理字符串,字符串虽然操作简单,但非常重要。字符串的处理和分析在任何编程语言中都是一个重要的基础,往往是简单而重要。比如:信息的分类、解析、存储和显示,以及网络中的数据传输都需要操作字符串来完成,尤其在web开发中显得更为重要,日常的开发中大部分工作几乎都是在操作字符串,所以字母的处理也体现了程序员的一种编程能力
字符串的处理及特点
在面向过程的C语言中,字符串是作为字节数组处理的,而在面向对象的Java语言中,字符串是作为对象处理的,因为在java语言中一切皆对象在,java中,字符串实际是一个char数组(字符数组)。PHP则把字符串作为一种基本的数据来处理。字符串是一系列字符。在PHP中,字符和字节一样,也就是说共有256种不同字符的可能性。这也说明PHP对Unicode没有本地支持,一个GB2312编码的汉字占2个字节,一个UTF-8编码的汉字占3个字节。通常对字符串的处理涉及字符串的格式化、字符串的分割以及连接、字符比较,字符查找、字符匹配和替换等等操作。在PHP中,提供了大量的字符串的操作函数,功能强大,使用简便,但是对于一些比较复杂的字符串操作则需要借助PHP所支持的正则表达式来实现。如果字符串处理函数和正则表达式都可以实现字符串的操作,建议使用字符串处理函数来完成相关操作,因为字符串处理函数要比正则表达式处理字符串的效率高。但对于很多复杂的字符串操作,只有通过正则表达式才能完成,不过很多简单的操作在实际的开发中,PHP自带的字符串处理函数已经够用。
由于PHP是弱类型语言,所以其他类型的数据一般都可以直接应用于字符串操作函数里,而自动转换成字符串类型进行处理。比如:不需要像Java语言需要把其他数据先转化成字符串才能进行字符串的相关操作,大大降低了编码的复杂度,但是强类型语言和弱类型语言都各自的优势。就像生活,不过选择哪种过法,都需要作出一些舍弃。扯远了,言归正传,下面通过例子来了解字符串的特点:
<?php
echo substr("hello world",2,4);
echo "<br>";
echo substr(123456,2,4);
echo "<br>";
echo hello; //会先找hello常量,找不到就会将常量名当作字符串使用
输出结果如下:
在以上的示例中,将不同的数据类型的数据使用字符串截取处理函数substr()处理,依然能得到想要的结果.不仅如此,还可以将字符串"视为数组",当作字符集合看待.字符串中的字符可以通过在字符串之后用中括号(有些地方称方括号)指定所要从0开始的偏移量来访问和修改相关元素(在编程语言中,几乎所有语言的索引下标都是从0开始,我们的生活中一般从1开始,所以一定不要搞混),下面我们通过具体的实例来体会一下:
<?php
$s = "hello";
echo $s;
echo "<br>";
echo $s[0];
echo $s[1];
echo $s[2];
echo $s[3];
echo $s[4];
echo "<br>使用连接符:";
echo $s[0].$s[1].$s[2].$s[3].$s[4];
执行结果:不管是直接输出还是当成数组来访问都可以正常输出字符串,都可以得到一样的输出,而且使用数组的方式更为灵活.
不过将字符串看作字符集合是,并不时真正的数组,不能使用数组的处理函数操作,比如:count($str)并不能获取到字符串的长度.而PHP脚本引擎无法区分是字符还是数组,会带来二义性.之前还可以使用花括号的语法访问字符或者数组,现在已不再使用,已经过时弃用,或不建议使用,后面使用中括号来替代它,为了向下兼容,花括号的访问方式仍可使用,比如下面的例子,仍可以正常输出,只不过或有相关的警告.
<?php
$s = "hello";
echo $s;
echo "<br>";
echo count($s);
echo "<br>";
echo $s{0};
echo $s{1};
echo $s{2};
echo $s{3};
echo $s{4};
echo "<br>使用连接符:";
echo $s{0}.$s{1}.$s{2}.$s{3}.$s{4};
执行结果如下:
双引号中的变量解析
当双引号或者定界符指定字符串是,其中的变量会被解析.有两种语法:一种是"简单的",一种是"复杂的".简单语法最通用和简便,他提供了解析变量,数组值或者对象属性的方法.复杂语法是从PHP4开始引进的,可以用花括号括起一个表达式.简单的语法我们前面的文章也曾是用过,如果遇到美元符号($),解析器会尽可能多地取得后面字符串以组成一个合法的变量名.若想明确指定名字的结束,可用花括号将变量名括起来.当然,在双引号中,同样也可以解析数组索引或者对象属性.对于数组索引,右方括号"]"标志着索引的结束.对象属性则和简单变量适用同样的使用规则:
<?php
class Student{
public $name;
public $age;
function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
}
$strArray = array('name'=>'zhangsan','age'=>'18', 'sex'=>'male','school'=>'xiwangxiaoxue');
echo "student name is $strArray[name]";//不要在[]中使用引号,否则会在引号处结束
echo "<br>";
//echo "student name is $strArray['name']";//不要在[]中使用引号,否则会在引号处结束,会报错如果使用单引号在中括号里面,需用使用花括号括住变量
echo "student name is {$strArray['name']}";//不要在[]中使用引号,否则会在引号处结束,会报错如果使用单引号在中括号里面,需用使用花括号括住变量
echo "<br>";
echo "student name is {$strArray[name]}";//这样也可以解析,但要注意PHP将数组下标看作了常量名,并且当不在时将常量名称转为了字符串,效率较低
echo "<br>";
$st = new Student("lisi",12);
echo "student name is $st->name";
echo "<br>";
echo "student name is $st->name00";//无法解析,可使用花括号括起来
echo "<br>";
echo "student name is {$st->name}00";
执行结果如下:
使用在方括号中使用使用引号直接报错无法解析:
注释掉之后执行结果如下:
对于任何更复杂的情况,应该使用复杂语法,不是因为复杂而称其复杂,而是因为用这个方法可以包含的表达式更为复杂.实际上,使用此语法可以在字符串中包含任何在名字空间的值.仅仅用和在字符串之外同样的方法写一个表达式,然后用一对花括号{}把它包含进来.因为不能转义"{",此语法仅在$紧跟在{后面时被识别(可以用"{\$"来得到一个字面上的"{$")
使用字符串需要注意的事项
- 一个字符串变得非常巨大也没有问题,PHP没有强加限制字符串的大小范围,所以完全没有必要担心长字符串.
- 不要指望在将一个字符转换成整型时能够得到该字符的编码,可能在C语言中会这么做,但是在PHP中,如果希望在字符编码和字符之间转换,可使用ord()和chr()函数处理.
- 在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串.