PHP字符串备忘录

211 阅读3分钟

本文主要讲述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、字符串查找

字符串查找有多种方法,常见的有strposstrstr以及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、字符串分割

字符串分割有两种方法:explodestr_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"

参考教程

PHP 5 String 函数