String 字符串
字符串(string)就是由一系列的字符组成的,其中每个字符都等同于一个字节。在php中只支持256字符集,不支持unicode。
php中的字符串的实现方式是由字节组成的数组再加上一个指明缓冲区长度的整型组成。该数据类型并不包含如何将字节转化为字符的信息,这些信息都是由程序员来控制的。字符串的组成没有什么限制,特别的是,其值为0即(null byte)的字节可以处于字符串的任何位置。还需要留意的是在相关的一些处理函数中,可能会把null字节之后的数据全部忽略掉,这点在使用的时候需要特别留意。
Note:String最大可以达到2GB
字符串的表达方式
1.单引号
定义一个字符串最简单的方式就是用单引号将字符串内容包含起来。在单引号定义的字符串中,变量和特殊字符的转义序列不会被替换。
$string_var = 'hello world';
echo $string_var;//hello world
echo "<br>";
$string_var = 'hello \world';
echo $string_var;//hello \world
echo "<br>";
$string_var2 = 'China $string_var';
echo $string_var2;//China $string_var
echo "<br>";
2.双引号
如果是以双引号将字符串内容包含起来的方式定义,那么需要注意:php会对一些特殊字符进行解析的,通常来说就是我们熟知的转义字符了。
序列 含义
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\ 反斜线
\$ 美元标记
\" 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
和单引号定义方式比较最大的不同点是:双引号定义的字符串如果里面包含变量,那么该变量会被php解析。
$string_var = 'hello \world';
echo $string_var;//hello \world
echo "<br>";
$string_var2 = 'China $string_var';
echo $string_var2;//China $string_var
echo "<br>";
$string_var3 = "China $string_var";
echo $string_var3;//China hello \world
echo "<br>";
3.Heredoc结构
这种方式类似于xml定义格式,有一个开始标记和结束标记。heredoc的语法结构:
$var = <<< flag
........here is your content
flag;
flag值可以根据自己的喜好来自定义,但必须要遵循php命名规范。另外需要注意的是在结束标识这行除了;外,不能包含其他字符。这就是说在标识符和分号前面不能有任何的缩进,字符。标识符和分号之间也是一样。如果没有遵循这条规则,php将认为该标识不是结束标识而将继续寻找,如果在文件结尾也没有找到的话,php将会产生解析错误。
$str = <<<ENDFLAG
Example of string
ENDFLAG;
echo $str;//Example of string
echo "<br>";
nowdoc结构和heredoc的结构很相似,但是nowdoc中不进行解析操作,也就是说nowdoc和单引号定义的字符串在一定意义来说是等价的。
nowdoc的结构和hereddoc的结构一样使用标记<<<,区别是在<<<之后的标识符要用单引号括起来(<<<'flag')。
$str = <<<'ENDFLAG'
Example of string
ENDFLAG;
echo $str;//Example of string
echo "<br>";
string可以当作字符数组来使用,其起始索引为0,比如有一个字符串$var="hello world",那么我们可以通过$var[0]的形式来获取或修改字符串。
$string_var4 = "hello world!";
echo $string_var4[0];//h
echo "<br>";
$string_var4[0] = "f";
echo $string_var4;//fello world!
echo "<br>";
1.string addcslashes(string $str,string $charlist)
以c语言风格使用反斜线转义字符串中的字符。
该函数在属于charlist列表中的字符签都加上反斜线后返回字符串。
$string_addcslashes = "hello\rworld\n";
echo addcslashes($string_addcslashes, "c..e");//h\ello worl\d
2.string bin2hex(string $str)
把二进制参数str转化为十六进制的字符串。转化使用字节方式,高4位优先。
$stirng_bin2 = "11111001";
echo bin2hex($stirng_bin2);//3131313131303031
echo "<br>";
3.string chunk_split(string $str,[,int $chunklen = 76[,string $end = "\r\"]])
将字符串分割成小块。
$str:要分割的字符
chunklen:分割的尺寸
end:行尾序列符号
$str = "Yarım kilo çay, yarım kilo şeker";
echo chunk_split($str, 4) ."\n";//Yar� �m k ilo çay , ya rım kil o ş eker
4.string rtrim(stirng $str,[,sstring $character_mask])
删除字符串末端的空白字符(或这其他字符)
如果第二个参数使用默认值,那么rtrim仅删除以下字符:
- " " (ASCII 32 (0x20)),普通空白符。
- "\t" (ASCII 9 (0x09)),制表符。
- "\n" (ASCII 10 (0x0A)),换行符。
- "\r" (ASCII 13 (0x0D)),回车符。
- "\0" (ASCII 0 (0x00)),NUL 空字节符。
- "\x0B" (ASCII 11 (0x0B)),垂直制表符。
$string_rtrim = "\t\tThese are a few peoples :) ... ";
echo rtrim($string_rtrim);//These are a few peoples :) ...
echo "<br>";
echo rtrim($string_rtrim, " \t.");//These are a few peoples :)
echo "<br>";
5.string str_repeat(string $input,int $multiplier)
重复一个字符串,multiplier为重复次数且值必须大于0,如果为0,返回空.
$string_repeat = "-+*";
echo str_repeat($string_repeat, 4);//-+*-+*-+*-+*
echo "<br>";
6.mixed str_replace(mixed $search,mixed $replace,mixed $subject [,int &$count ])
该函数返回将subject中全部的search全部替换为replace之后的结果.
如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。
$str = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order = array("\r\n", "\n", "\r");
$replace = '<br />';
echo str_replace($order, $replace, $str);
echo "<br>";
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);
echo "<br>";
$search2 = array('A', 'B', 'C', 'D', 'E');
$replace2 = array('C', 'D', 'E', 'F');
$subject2 = 'A';
echo NULL==str_replace($search2, $replace2, $subject2)?"null":str_replace($search2, $replace2, $subject2);
echo "<br>";
Line 1
Line 2
Line 3
Line 4
F
null
7.array str_split(string $string[,int $split_length = 1])
如果指定了可选的 split_length 参数,返回数组中的每个元素均为一个长度为 split_length 的字符块,否则每个字符块为单个字符。
如果 split_length 小于 1,返回 FALSE。如果 split_length 参数超过了 string 超过了字符串 string 的长度,整个字符串将作为数组仅有的一个元素返回。
$string_splist = "hello friends,welcome to Xi'an";
print_r(str_split($string_splist));
echo "<br>";
print_r(str_split($string_splist, 3));
echo "<br>";
print_r(str_split($string_splist, 100));
echo "<br>";
输出:
Array ( [0] => h [1] => e [2] => l [3] => l [4] => o [5] => [6] => f [7] => r [8] => i [9] => e [10] => n [11] => d [12] => s [13] => ,
[14] => w [15] => e [16] => l [17] => c [18] => o [19] => m [20] => e [21] => [22] => t [23] => o [24] => [25] => X
[26] => i [27] => ' [28] => a [29] => n )
Array ( [0] => hel [1] => lo [2] => fri [3] => end [4] => s,w [5] => elc [6] => ome [7] => to [8] => Xi [9] => 'an )
Array ( [0] => hello friends,welcome to Xi'an )
8.int strlen(string $string)
返回指定字符串的长度.如果为空,则返回0.
$string_strlen = "hahahhahaah";
echo strlen($string_strlen);//11
echo "<br>";
$string_strlen = "";
echo strlen($string_strlen);//0
echo "<br>";
9.mixed strpos(string $haystack, mixed $needle [, int $offset = 0 ] )
参数
haystack:在该字符串中进行查找。
needle:如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
offset:如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。 如果是负数,搜索会从字符串结尾指定字符数开始。
返回值
返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。如果没找到 needle,将返回 FALSE。
$string_strpos = 'samples samples';
echo strpos($string_strpos, 'p');//3
echo "<br>";
我的环境中上面offset指定为负数的时候返回值为false,有兴趣的可以试一试,可能是和php版本有关系,貌似是7.1后才支持的。
当然还有很多函数,使用的时候大家可以去参考php手册,我就不一 一介绍了。