1.PHP 字符串是二进制安全,可以任意加长与缩短,大小限制为PHP可以使用的内存数量;Tips: 通常情况下PHP默认为ASCII字符串,对于其它数据的字符编码,可能需要转换。
2.初始化的形式:单引号,双引号,heredoc 三种
2.1 单引号: 在这里面的字符串只需要转义反斜杠与单引号本身。此中字符串,PHP不会检查里面的变量和转义序列(查看双引号中说明),所以速度比较快
例如:
print 'I\'m boy!'; // 转义单引号,结果: I'm boy!
print 'c:\\php'; // 转义反斜杠,结果: c:\php
print 'It is cost $12.03 \n '; // 不转义变量与转义序列,结果:It is cost $12.03 \n
2.2 双引号: 不识别转义的单引号,但识别变量与转义序列(如下表)
转义序列 字符
\n 换行符(ASCII-->10)
\r 回车符(ASCII-->13)
\t 制表符(ASCII-->9)
\$ 美元符号
\\ 反斜杠
\" 双引号
\0~\777 8进制数值
\x0~\xFF 16进制数值
例如:
print "The sauce cost \$\061\060.\x31\x35 \n"; // 美元符号、8进制、16进制数值、换行符
2.3 heredoc形式:使用 <<< 符号添加"记号",然后最后以"记号+分号"结束(特殊情况:如果做了字符串拼接,则分号不是必需的)。按约定记号通常大写,结束的时也一样,这是大小写敏感的。此定义的字符串,保留了换行符、空格、引号,主要作用在输出HTML的数据,因为不需要转义HTML的中双引号。
例如:
print <<< END
my name is yangping,
my age is 25 years!
<a href="">Login</a>
END; // 结果会输出现两排字符串,Tips:此例子前面不应该有空格,即print要顶格写
$li = '<li>1111111</li>';
$html = <<< MYHTML
<body><ul>
MYHTML
.$li.'</ul></body>';
echo $html; // 注意为了使PHP识别记号,后面的连接字符不能与结束记号同行!
3.字符串由字符组成,可以通过方括号(大括号)+索引取到对应的字符。Tips:推荐使用大括号,用于与数组索引的区分
例如:
$a = 'abcedf'; echo $a[2], "\t", $a{2}, "\n"; // 结果为 c
4.常用字符串API:
strpos: 查询字符串首次出现的位置。
返回值:没找到返回false,注意如果是在第一个位置,则返回0,判断的时候用 === 或 !== ,否则出错
例子:
if(strpos('[email protected]', '@') === false) { echo '没找到!'; }
或者
if(strpos('[email protected]', '@') !== true) { echo '没找到!'; }
substr: 截取指定字符串。 $substring = substr($string, $start, $length);
例子:
$a = 'watch out of that tree';
echo substr($a, 6), ' 到结尾,$start的值大于字符串的长度就返回false<br/>';
echo substr($a, 6, 5), ' 从6开始取5个长度<br/>';
echo substr($a, -6), ' 倒着数6位开始,到结尾<br/>';
echo substr($a, -6, 5), ' 倒着数6位开始,取5个长度<br/>';
echo substr($a, -strlen($a) - 9), ' 负值且超过字符串长度,则视为0<br/>';
echo substr($a, 5, -2), ' 负的长度,会截取最后两位<br/>';
echo substr($a, -6, -1), ' 负的长度,会截取最后两位<br/>';
substr_replace: 替换子字符串。
$b = 'Replace_String';
$c = <<< end
It's funny when signs say things like:
Original "Root" Beer
"Free" Gift
Shoes cleaned whild "you" wait
or have other misquoted words.
end;
echo substr_replace($c, $b, 3), ' 没有指定替换的长度,将替换到结尾<br/>';
echo substr_replace($b, 'XXXX ', 0, strlen($b)-4), ' 指定长度,只保留最后4位<br/>';
echo substr_replace($b, 'GGGG', -10, 3), ' 开始位置为负的,倒着数,替换3位长度<br/>';
echo substr_replace($b, 'YYYY', 0, 0), ' 开始与长度都是0,就插入到旧字符串的头处<br/>';
strrev: 按字节反转字符串
例子:
echo strrev('string'), ' 按字节反转字符串<br/>';
explode: 根据指定字符分割字符串,返回数组
implode(可以参考 join ): 用指定的字符连接数组,组成字符串,返回字符串
array_reverse: 反转数组中的值,key不变
以上三个函数的例子如下:
$s = 'Once upon a time there was a turtle';
$words = explode(' ', $s); // 按空格分解为数组
$words = array_reverse($words); // 通过数组反转字符
echo $s, '<br/>', implode(' ', $words), '<br/>'; // 把数组的值重新组合
preg_replace_callback: // 参考API
ucfirst或ucwords: 将一个或多个单词的首字母转换为大写形式,其它地方的字符不变;Tips: 对于ucwords而言,一个单词是指任何非空白字符序列后面跟一个或多个空白字符。此函数的使用会考虑到本地化的设置。
例子:
echo ucfirst('how do you do today?'), ' 把字符串的首字母转为大写形式<br/>';
echo ucwords('how do you do today?'), ' 把字符串中每个单词的首字母转为大写形式<br/>';
echo ucwords("don't play zone defence against the philadelphia 76-ers"), " don't 和 76-ers 被认为是一个单词,所以不会把 t 和 e 转换为大写";
strtolower或strtoupper: 反整个字符串转换为小写或大写。Tips: 此函数的使用会考虑到本地化的设置。
例子:
echo strtolower('My Love Is You!'), ' 字符串转换为小写<br/>';
echo strtoupper('My Love Is You!'), ' 字符串转换为大写<br/>';
ltrim、rtrim或trim: 删除字符串左边、右边或者两边的空白字符,空白字符有:换行符、回车符、空格符、水平和垂直制表符和空值(null); 通过第二个参数可以删除用户指定的字符,首字符与未字符之间用两个点来表示范围,详情请看例子。
例子:
echo $trim_str = '444我的前面和后面都有空格,6(中间的数字)!8888', '<br/>';
echo ltrim($trim_str), ' 删除了左边的空格,默认是空格,没有第二个参数<br/>';
echo rtrim($trim_str), ' 删除了右边的,默认是空格,没有第二个参数<br/>';
echo trim($trim_str), ' 删除了两边的,默认是空格,没有第二个参数<br/>';
echo ltrim($trim_str, ' 0..9'), ' 通过第二个参数删除左边空格和0到9的数字<br/>';
echo rtrim($trim_str, ' 0..9'), ' 通过第二个参数删除右边空格和0到9的数字<br/>';
echo trim($trim_str, ' 0..9'), ' 通过第二个参数删除两边空格和0到9的数字<br/>';
fputcsv: 指定字符分隔数据并保存到CSV文件中
例子1: 把数据保存到文件
$arr_fputcsv = array(
array('2013-01-10', 'ysp01', 111),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
);
$fh = fopen('sale.csv', 'w') or die(ucfirst("can't open sale.csv"));
foreach ($arr_fputcsv as $key => $sale_line) {
if (fputcsv($fh, $sale_line) === false) {
die(ucfirst("can't write CSV file!"));
}
}
if (fclose($fh)) {
echo ucfirst('save'), ' ', strtoupper( 'Success !把数据保存为CSV格式的文件,完成!<br/>');
} else {
die(ucfirst("can't clase sale.csv"));
}
例子2: 直接使用PHP的输出流(php://output),不保存到文件
$arr_fputcsv = array(
array('2013-01-10', 'ysp01', 111),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
);
$fh = fopen('php://output', 'w') or die(ucfirst("can't open php://output"));
foreach ($arr_fputcsv as $key => $sale_line) {
if (fputcsv($fh, $sale_line) === false) {
die(ucfirst("can't write php://output !"));
}
}
if (fclose($fh)) {
echo ucfirst('save'), ' ', strtoupper( 'Success !把数据保存输出流中输出了!<br/>');
} else {
die(ucfirst("can't clase php://output"));
}
例子3: 把数据保存到一个字符串中,在例2中,已经把数据保存到了输出流中,下面可以通过缓存技术取到数据并保存到字符串中
$arr_fputcsv = array(
array('2013-01-10', 'ysp01', 111),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
array('2013-02-20', 'ysp02', 222),
);
ob_start();
$fh = fopen('php://output', 'w') or die(ucfirst("can't open php://output"));
foreach ($arr_fputcsv as $key => $sale_line) {
if (fputcsv($fh, $sale_line) === false) {
die(ucfirst("can't write php://output !"));
}
}
$fputcsv_str = ob_get_clean();
if (fclose($fh)) {
echo $fputcsv_str, ucfirst(' save'), ' ', strtoupper( 'Success !把数据保存到缓存的输出流中,然后保存到字符串!<br/>');
} else {
die(ucfirst("can't clase php://output"));
}
例子4: 产生一个可下载的CSV文件
$title = array('Region', 'Start Date', 'End Date', 'Amount');
$datas = array(
array('ysp1', '2013-01-11', '2013-11-11', 1111),
array('ysp2', '2013-12-11', '2013-12-28', 2222),
array('ysp3', '2015-01-01', '2016-11-11', 3333));
$output = fopen('php://output', 'w') or die('Can not open php://output !');
$total = 0;
header('Content-Type: application/csv'); // 告诉浏览器此文件是CSV文件
header('Content-Disposition: attachment; filename="sale.csv"'); // 选择浏览器用附件的形式打开
fputcsv($output, $title);
foreach ($datas as $key => $sales_line) {
fputcsv($output, $sales_line);
$total += $sales_line[3];
}
fputcsv($output, array('总计:', '--', '--', $total));
fclose($output) or die('Can not close php://output !');
fgetcsv: 从指定的CSV文件中读取数据,最好给个length,速度会快点
例子1:
$fh_get = fopen('sale.csv', 'r');
echo "<table border = 1>\n";
while ($csv_line = fgetcsv($fh_get)) {
echo "<tr>\n";
for ($i=0; $i < count($csv_line); $i++) {
echo '<td>', htmlspecialchars($csv_line[$i]), '</td>';
}
echo "</tr>";
}
echo "</table>\n";
fclose($fh_get) or die("Can't close file !");
str_pad: 用一个字符串填充另一个字符串到指定的长度,Tips:如果长度为负、小于或等于填充的字符串长度,则原样返回
例子1:
echo str_pad('input', 10), ' 默认的填充方式,在右边,使用空格填充到10个长度<br/>';
echo str_pad('input', 10, '~'), ' 默认在右边,使用~填充到10个长度<br/>';
echo str_pad('input', 10, '~', STR_PAD_LEFT), ' 在左边,使用~填充到10个长度<br/>';
echo str_pad('input', 10, '~', STR_PAD_BOTH), ' 在两边,使用~填充到10个长度,先右后左<br/>';
pack、unpack: 这个不好理解啊!Tips:对于a、A、h和H,后面的数字表示这个字符串有多长,
如:A25 ---> 表示一个25个字符、以空格填充的字符串。其它后面的数字表示相应的类型在字符串中出现的次数,使用*表示其余的现有数据。
此两个函数的格式化字符:
a 无填充的字符串
A 空格填充的字符串
h 16位字符串,以低4位字节开始
H 16位字符串,以高4位字节开始
c 带符号的字符
C 无符号的字符
s 带符号的短整型数(16位,计算机字节序列)
S 无符号的短整型数(16位,计算机字节序列)
n 无符号的短整型数(16位,big endian字节序列)
v 无符号的短整型数(16位,little endian字节序列)
i 带符号的整数(大小与字节序列同计算机相关)
I 无符号的整数(大小与字节序列同计算机相关)
l 带符号的长整型(32位,计算机字节序列)
L 无符号的长整型(32位,计算机字节序列)
N 无符号的长整型(32位,big endian字节序列)
V 无符号的长整型(32位,little endian字节序列)
f 浮点型数(大小和表示法同计算机相关)
d 双精度型数(大小和表示法同计算机相关)
x 空字节
X 倒退一个字节
@ 绝对位置以空值填充
例子1:
$s = 'platypus';
$ascii = unpack('c*', $s);
print_r($ascii);
str_split: 把字符串按指定的长度分割为数组,默认长度为1,Tips:长度为负的,返回false;长度超过string长度就做为一个返回
例子1:
echo '默认的分割方式,单字符数组:<br/>';
var_dump(str_split('Hello world'));
echo '指定长度分割:<br/>';
var_dump(str_split('Hello world', 5));
preg_split: 执行一个正则分割
例子1:
echo '正则分割,默认是区分大小写的,可以在正则表达式中添加/i参数来不区分:<br/>';
var_dump(preg_split('/ x /', '31 inches x 22 inches X 9 inches'));
wordwrap: 指定长度自动换行
例子1:
$wrap_str = <<< WRAP
Four score and seven years ago out fathers brought forth
on this continent a new nation, conceived in liberty and
dedicated to the proposition that all men are createed equal.
WRAP;
echo "<pre>使用默认的换行,一行75个字符:<br/>", wordwrap($wrap_str), "<br/></pre>";
echo "<pre>使用默认的换行(\\n),不过HTML不认,需要用pre标签:<br/>", wordwrap($wrap_str, 30), "<br/></pre>";
echo "指定长度后,添加换行符:<br/>", wordwrap($wrap_str, 30, "<br/>"), '<br/>';
echo "超过长度,可以用第4个参数做控制是否换行,默认在一行不自动换:<br/>", wordwrap('abcdefgh', 4), '<br/>';
echo "超过长度,可以用第4个参数做控制是否换行:<br/>", wordwrap('abcdefgh', 4, '<br/>', 1);
5.在字符串中插入函数或表达式
5.1 可以把变量、对象的属性、数组元素直接放在双引号中使用,Tips: 此时数组的引用变量不能加引号。
使用大括号可以引入复杂的表达式。
例子:
$children = 6;
$ob_sub = new stdClass();
$ob_sub->age = 78;
$ob = new stdClass();
$ob->name = 'yangping';
$ob->children = $ob_sub;
$arr = array('length' => 999, 888);
function getMony() {
return 999;
}
class Test1 {
public function getMony() {
return 8888;
}
public static function getCount() {
return 777;
}
}
$t = new Test1();
function getMony1() {
return 666;
}
echo "I have $children children", ' 取变量值<br/>';
echo "My name is $ob->name", ' 取对象属性值,这个值不能再指定下一级<br/>';
echo "Array length is $arr[length]", ' 数组索引不能加引号,不推荐这样使用,因为$arr[\'length\']的效率比$arr[length]快<br/>';
echo '字符串中添加复杂表达式,Tips:在上面的取值中,也可以直接用大括号包起来取<br/>';
echo "I have {$children} children", ' 使用大括号取变量值<br/>';
echo "My name is {$ob->name}", ' 取对象属性值';
echo "My name is {$ob->children->age}", ' 使用大括号取对象属性值,可以取到下一级<br/>';
echo "Array length is {$arr['length']}", ' 使用大括号取数组索引值,索引添加引号<br/>';
echo "My money 1 {getMony1()}", ' 使用大括号直接访问方法,<font color=red>错误</font>,取不到值<br/>';
echo "My money 2 {$t->getMony()}", ' 使用大括号取对象中的方法返回值,Tips:非静态方法只能用 -> <br/>';
echo "My money 3 {$t::getCount()}", ' 使用大括号取对象中的方法返回值,Tips:静态方法可以用 -> 也可以用 :: 来访问<br/>'