本文主要讲述PHP字符串中单引号和双引号的区别,以及高频使用的字符串函数,以作备忘。其中部分函数(兼容中文的)不是PHP内置支持的,都是在Laravel框架下测试的,这个需要注意下。
一、单引号 VS 双引号
PHP的字符串中,比较奇葩的当属单引号与双引号了。由于之前写其他语言先入为主,导致以为在PHP中,单引号和双引号也是等价的,其实不然,两者还是有一定区别的。
第一点:单引号不会处理变量,双引号则相反
$str = 'hello world';
echo '$str' . PHP_EOL; // 输出 '$str'
echo "$str" . PHP_EOL; // 输出 'hello world'
第二点:单引号不会处理转义(除了\\和\'这两个),双引号则相反
$quote1 = 'I\'m a boy';
$quote2 = 'I like go\\money';
$quote3 = 'I\t am a boy';
echo $quote1 . PHP_EOL; // I'm a boy
echo $quote2 . PHP_EOL; // I like go\money
echo $quote3 . PHP_EOL; // I\t am a boy
$doubleQuote1 = "I\'m a boy";
$doubleQuote2 = "I like go\\money";
$doubleQuote3 = "I\t am a boy";
echo $doubleQuote1 . PHP_EOL; // I\'m a boy
echo $doubleQuote2 . PHP_EOL; // I like go\money
echo $doubleQuote3 . PHP_EOL; // I am a boy(空格是\t的缘故)
引号使用注意事项:
1.由于双引号会解析变量,所以在用的时候要比较小心,否则可能会出现意想不到的结果(被替换),一般尽量使用单引号
2.由于双引号会解析变量,所以效率没有单引号高
3.这一点是写这篇笔记突然想到的,为啥PHP中的变量必须以美元符号开头?因为如果不以美元开头,再加上双引号会解析变量的特性,就会使代码非常难理解,比如下面:
$arr1 = ['aa' => 1, 'bb' => 2, 'cc' => 3];
$aa = 'bb';
echo $arr1['aa']; // 1
echo $arr2["aa"]; // 如果变量前不需要美元符号,这里应该是2,因为aa被替换为bb
二、字符串处理函数
1、字符串拼接
PHP的字符串拼接使用点号,而不是常见的加号,这样的好处就是区分算术运算和字符串连接,在使用加号的时候不用做额外的判断;弊端就是对于已经使用过其他语言的人来说会不太习惯。
# 输出hello world!
echo 'hello' . ' world!';
# 输出hello world!
$text = 'hello';
$text .= ' world!';
echo $text;
2、字符串长度获取
字符串长度有两种方式,一是strlen,二是mb_strlen,mb_strlen相对于strlen,能够通过设置字符编码从而返回对应的字符数,很好的处理了中文字符串的长度问题。
# 12(中文一个字当成三个字符)
$str = 'hello 世界';
var_dump(strlen($str));
# 8 (中文一个字当成一个字符)
var_dump(mb_strlen($str));
3、字符串截取
字符串长度有两种方式,一是substr,二是mb_substr。类似strlen函数,substr在处理包含中文的字符串的截取时也有问题,一般要替换成 mb_substr
$str = 'hello 世界';
# 语法:substr ($string, $start, $length = null)
# 输出 hello �
var_dump(substr($str, 0, 7));
# 语法:mb_substr($str, $start, $length = null, $encoding = null)
# 输出 hello 世
var_dump(mb_substr($str, 0, 7));
4、字符串查找
字符串查找有多种方法,常见的有strpos、strstr以及str_contains等。
$str = 'hello 世界';
# stripos:查找第一次出现的位置,不区分大小写
# 注意如果传入的是数字,会转成对应ASCII码的字符串
var_dump(stripos($str, 'l')); // 2
var_dump(stripos($str, 'L')); // 2
var_dump(stripos($str, 'el')); // 1
var_dump(stripos($str, '界')); // 9(按字节数算)
var_dump(stripos($str, 'b')); // false(找不到)
var_dump(stripos($str, 76)); // 2(76的ASCII码是L)
# strripos:查找最后一次出现的位置,不区分大小写(此处省略测试)
# strpos:查找第一次出现的位置,区分大小写
# 注意如果传入的是数字,会转成对应ASCII码的字符串
var_dump(strpos($str, 'l')); // 2
var_dump(strpos($str, 'L')); // false
var_dump(strpos($str, 'el')); // 1
var_dump(strpos($str, '界')); // 9
var_dump(strpos($str, 'b')); // false
var_dump(strpos($str, 76)); // false
# strrpos:查找最后一次出现的位置,区分大小写(此处省略测试)
# mb_strpos:和strpos类似,区别是兼容中文字符的查找
var_dump(mb_strpos($str, '界')); // 7
# strstr:查找第一个出现的字符串,区分大小写;默认返回后半部分,也可传参返回前半部分
var_dump(strstr($str, 'l')); // llo 世界 (返回后半部分)
var_dump(strstr($str, 'l', true)); // he(返回前半部分)
var_dump(strstr($str, 'L')); // false
var_dump(strstr($str, 'el')); // ello 世界
var_dump(strstr($str, '界')); // 界
var_dump(strstr($str, 'b')); // false
var_dump(strstr($str, 76)); // false
# stristr:和strstr类似,区别在于不区分大小写
# str_contains:判断字符串是否存在于某个字符串中,区分大小写
var_dump(str_contains($str, 'l')); // true
var_dump(str_contains($str, 'L')); // true
var_dump(str_contains($str, '界')); // true
var_dump(str_contains($str, 108)); // true
5、字符串分割
字符串分割有两种方法:explode 和 str_split。
# 语法:explode ($delimiter, $string, $limit = null)
# explode 的分割符不能为空
var_dump(explode(' ', $str)); // ['hello', '世界']
var_dump(explode('l', $str)); // ['he', '', 'o 世界']
# 语法:str_split ($string, $split_length = 1)
# str_split 相当于用空字符分割,split_length表示每个子字符串的长度
# ['h', 'e', ...., '�']
var_dump(str_split($str));
# ['he', 'll', ..., '��']
var_dump(str_split($str, 2));
# 兼容中文
var_dump(mb_str_split($str));
6、数组合并为字符串
# list
$arr = ['hello', 'world'];
$str = implode($arr, ' | ');
var_dump($str); // "hello | world"
# map
$arr = ['aa' => 1, 'bb' => 2];
var_dump(implode($arr, ' | ')); // "1 | 2"
7、字符串去除空格
$str = ' hello world ';
var_dump(trim($str, ' ')); // "hello world"
var_dump(ltrim($str, ' ')); // 只去除左边 "hello world "
var_dump(rtrim($str, ' ')); // 只去除右边 " hello world"