12. PHP String 字符串(2)

来源:互联网 发布:算法的概念简单例题 编辑:程序博客网 时间:2024/04/30 03:19

存取和修改字符串中的字符

string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。函数 substr() 和 substr_replace() 可用于操作多于一个字符的情况。

Note: string 也可用花括号访问,比如 $str{42}。 
Warning 用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个 E_NOTICE 级别错误。用负数下标写入字符串时会产生一个 E_NOTICE 级别错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是 NULL 字符。
Warning PHP 的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如 ISO-8859-1 的字符串进行此类操作

Example #9 一些字符串示例

<?php// 取得字符串的第一个字符$str = 'This is a test.';$first = $str[0];// 取得字符串的第三个字符$third = $str[2];// 取得字符串的最后一个字符$str = 'This is still a test.';$last = $str[strlen($str)-1]; // 修改字符串的最后一个字符$str = 'Look at the sea';$str[strlen($str)-1] = 'e';?> 

自 PHP 5.4 起字符串下标必须为整数或可转换为整数的字符串,否则会发出警告。之前例如 “foo” 的下标会无声地转换成 0。

Example #10 PHP 5.3 和 PHP 5.4 的区别

<?php$str = 'abc';var_dump($str['1']);var_dump(isset($str['1']));var_dump($str['1.0']);var_dump(isset($str['1.0']));var_dump($str['x']);var_dump(isset($str['x']));var_dump($str['1x']);var_dump(isset($str['1x']));?> 

以上例程在PHP 5.3中的输出:

string(1) "b"bool(true)string(1) "b"bool(true)string(1) "a"bool(true)string(1) "b"bool(true)

以上例程在PHP 5.4中的输出:

string(1) "b"bool(true)Warning: Illegal string offset '1.0' in /tmp/t.php on line 7string(1) "b"bool(false)Warning: Illegal string offset 'x' in /tmp/t.php on line 9string(1) "a"bool(false)string(1) "b"bool(false)
Note: []{} 访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回 NULL
Note: PHP 5.5 增加了直接在字符串原型中用 []{} 访问字符的支持。

有用的函数和运算符 :
字符串可以用 ‘.’(点)运算符连接起来,注意 ‘+’(加号)运算符没有这个功能。更多信息参考字符串运算符。
对于 string 的操作有很多有用的函数。
可以参考字符串函数了解大部分函数,高级的查找与替换功能可以参考正则表达式函数或 Perl 兼容正则表达式函数。
另外还有URL字符串函数,也有加密/解密字符串的函数(mcrypt 和 mhash)。
最后,可以参考字符类型函数。
转换成字符串
一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数 settype()。 一个布尔值 boolean 的 TRUE 被转换成 string 的 “1”。Boolean 的 FALSE 被转换成 “”(空字符串)。这种转换可以在 boolean 和 string 之间相互进行。 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。

Note: 在脚本的区域(category LC_NUMERIC)中定义了十进制小数点字符。参见 setlocale()。

数组 array 总是转换成字符串 “Array”,因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用echo $arr[‘foo’] 这种结构。要显示整个数组内容见下文。

在 PHP 4 中对象 object 总是被转换成字符串 “Object”,如果为了调试原因需要打印出对象的值,请继续阅读下文。为了得到对象的类的名称,可以用 get_class() 函数。自 PHP 5 起,适当时可以用 __toString 方法。

资源 resource 总会被转变成 “Resource id #1” 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。

NULL 总是被转变成空字符串。

如上面所说的,直接把 array,object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。

大部分的 PHP 值可以转变成 string 来永久保存,这被称作串行化,可以用函数 serialize() 来实现。如果 PHP 引擎设定支持 WDDX,PHP 值也可被串行化为格式良好的 XML 文本。

字符串转换为数值
当一个字符串被当作一个数值来取值,其结果和类型如下:

如果该字符串没有包含 ‘.’,’e’ 或 ‘E’ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e’ 或 ‘E’ 后面跟着一个或多个数字构成。

<?php$foo = 1 + "10.5";                // $foo is float (11.5)$foo = 1 + "-1.3e3";              // $foo is float (-1299)$foo = 1 + "bob-1.3e3";           // $foo is integer (1)$foo = 1 + "bob3";                // $foo is integer (1)$foo = 1 + "10 Small Pigs";       // $foo is integer (11)$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)$foo = "10.0 pigs " + 1;          // $foo is float (11)$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     ?> 

更多信息可以参考 Unix 手册中的 strtod(3)。

本节中的示例可以通过复制/粘贴到下面的代码中来显示:

<?phpecho "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";?> 

不要想像在 C 语言中的那样,通过将一个字符转换成整数以得到其代码。使用函数 ord() 和 chr() 实现 ASCII 码和字符间的转换。

字符串类型详解
PHP 中的 string 的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串由什么值来组成并无限制;特别的,其值为 0(”NUL bytes”)的字节可以处于字符串任何位置(不过有几个函数,在本手册中被称为非”二进制安全”的,也许会把 NUL 字节之后的数据全都忽略)。

字符串类型的此特性解释了为什么 PHP 中没有单独的”byte”类型 - 已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据 - 仍会返回字符串。

由于 PHP 并不特别指明字符串的编码,那字符串到底是怎样编码的呢?例如字符串 “á” 到底是等于 “\xE1”(ISO-8859-1),”\xC3\xA1”(UTF-8,C form),”\x61\xCC\x81”(UTF-8,D form)还是任何其它可能的表达呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte 时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。注意脚本的编码有一些约束(如果激活了 Zend Multibyte 则是其内部编码)- 这意味着此编码应该是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不过要注意,依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态,这可能会造成问题。

当然了,要做到有用,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP 关于此的函数有很多变种:

0 0
原创粉丝点击