字符串定义
php
<?php
/* 主要有4种方式:
1. 单引号
$str = 'str'
2. 双引号
$str = "str {$var}"
3. <<<'占位符'
$str = <<<'HTML'
HTML;
4.<<<占位符
$str =<<<JS_CODE
JS_CODE;
*/字符串分类
在 PHP 中字符串主要分为2类:
- 普通字符串: 只包含 ASSIC 码表中的字符
- 多字节字符串: 包含所有 unicode 码表中的字符
主要差异:
| 特性 | 普通字符串函数 | 多字节字符串函数 |
|---|---|---|
| 基本单位 | 字节 | 字符 |
| 编码意识 | 无 (二进制安全) | 有 (需指定编码) |
| 扩展要求 | 内置 | 需要 mbstring 扩展 |
| 函数前缀 | 无 (如: strlen, substr) | mb_ (如: mb_strlen, mb_substr) |
| 国际化支持 | 有限 (仅 ASCII) | 完全 (Unicode) |
字符串处理函数:
编码建议
直接将所有普通字符串处理函数全部替换为 mb_string 的处理函数
| 普通函数 | 多字节替代 | 注意事项 |
|---|---|---|
| strlen() | mb_strlen() | 需指定编码 |
| substr() | mb_substr() | 防止截断字符 |
| strpos() | mb_strpos() | 正确处理字符位置 |
| strtolower() | mb_strtolower() | 语言特定转换 |
| strtoupper() | mb_strtoupper() | 语言特定转换 |
| str_split() | mb_str_split() (PHP 7.4+) | 正确分割字符 |
一般来说, 这个扩展不需要手动安装, 如果实在不知道有没有可以使用 phpinfo() 查看
php
<?php
$text = "中文测试";
// 普通函数(错误结果)
echo strlen($text); // 输出:12 (UTF-8中每个中文字符占3字节)
echo "<hr/>";
// 多字节函数(正确结果)
echo mb_strlen($text, 'UTF-8'); // 输出: 4正则表达式
注意
PHP 的正则表达式是包裹在一个单引号中的 '/\d+/' 而 JS 是这样的 /\d+/, 其它的是一样的,请查看 JS 正则表达式笔记
正则表达式练习网站: https://regexlearn.com/zh-cn 正则表达式可视化解析工具: https://regex101.com/
php
<?php
echo "<pre>";
// 1. 正则表达式的类型
$regexp = '/(foo)(bar)(baz)/';
echo gettype($regexp); // string, 不像 JS 那样正则是 Regexp 类的实例
// 2. 正则表达式的使用方式
// $regexp: 保存表达式正则的字符串
// 'foobarbaz': 被匹配的字符串
// $matchers: 匹配的结果
// PREG_OFFSET_CAPTURE: 预定义常量, 表示捕获匹配的位置
preg_match($regexp, 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
echo "</pre>";
/*输出信息如下:
Array
(
[0] => Array
(
[0] => foobarbaz
[1] => 0
)
[1] => Array
(
[0] => foo
[1] => 0
)
[2] => Array
(
[0] => bar
[1] => 3
)
[3] => Array
(
[0] => baz
[1] => 6
)
)
*/字符串与数组互转
php
<?php
echo "<pre>";
// 字符串切分为数组
$str1 = "hello,world";
$arr1 = explode(",", $str1); // 用 , 分割 $str 为一个数组, 传入 '' 报错
var_dump($arr1);
// 输出信息如下:
// array(2) {
// [0]=>
// string(5) "hello"
// [1]=>
// string(5) "world"
// }
// 将数组合并为字符串
$str2 = implode("@", $arr1); // 将数组 $arr 中的每个元素都拼接成一个字符串
echo $str2;
// 输出信息如下:
// hello@world
echo "<hr/>";
// implode 别名 join, 两个方法的效果一模一样
$str3 = join("@", $arr1);
echo $str3; // hello@world
echo "</pre>";