PHP 字符串函数大全(速查参考)
1. 长度与截取
| 函数 | 说明 |
|---|---|
strlen($s) |
字节长度(中文 UTF-8 占 3 字节) |
mb_strlen($s [, $enc]) |
字符数(中文安全) |
substr($s, $off [, $len]) |
按字节截取(中文易乱码) |
mb_substr($s, $off [, $len] [, $enc]) |
按字符截取(中文安全) |
mb_strcut($s, $off [, $len]) |
按字节截取但保证不截断多字节字符 |
str_split($s [, $len]) |
拆分为等长子串数组(按字节) |
mb_str_split($s [, $len] [, $enc]) |
(PHP 7.4) 按字符拆分 |
php
$s = '中文abc';
strlen($s); // 9(3×3 + 3)
mb_strlen($s); // 5(字符数)
mb_substr($s, 0, 2); // '中文'
substr($s, 0, 2); // '�'(截断多字节,乱码)
2. 查找与定位
| 函数 | 说明 |
|---|---|
strpos($s, $n [, $off]) |
首次出现位置(字节偏移),未找到返回 false |
stripos($s, $n) |
不区分大小写 |
strrpos($s, $n) / strripos($s, $n) |
最后一次出现位置 |
strstr($s, $n) / stristr($s, $n) |
返回首次出现到末尾的子串(含 $n) |
strchr($s, $n) |
strstr 的别名 |
strrchr($s, $n) |
返回最后一次出现到末尾 |
str_contains($s, $n) |
(PHP 8.0) 是否包含子串,返回 bool |
str_starts_with($s, $p) |
(PHP 8.0) 是否以 $p 开头 |
str_ends_with($s, $p) |
(PHP 8.0) 是否以 $p 结尾 |
php
$hay = 'hello world';
strpos($hay, 'world'); // 6(位置,非 bool)
strpos($hay, 'xyz'); // false(必须用 === 判断)
// PHP 8.0 推荐写法(替代 strpos(...) !== false)
str_contains($hay, 'world'); // true
str_starts_with($hay, 'hello'); // true
str_ends_with($hay, 'world'); // true
3. 替换
| 函数 | 说明 |
|---|---|
str_replace($s, $r, $subj [, &$cnt]) |
子串替换(支持数组批量) |
str_ireplace(...) |
不区分大小写 |
substr_replace($s, $r, $off [, $len]) |
按位置替换 |
strtr($s, $from, $to) / strtr($s, $map) |
字符映射替换 |
php
str_replace('world', 'PHP', 'hello world'); // 'hello PHP'
str_replace(['a','b'], ['x','y'], 'abc'); // 'xyc'
// 危险字符过滤
strtr($s, ['<' => '<', '>' => '>']);
4. 大小写转换
| 函数 | 说明 |
|---|---|
strtolower($s) / strtoupper($s) |
转小写 / 大写(单字节,中文无效) |
ucfirst($s) / lcfirst($s) |
首字母大写 / 小写 |
ucwords($s [, $delim]) |
每个词首字母大写 |
mb_strtolower($s [, $enc]) / mb_strtoupper($s) |
中文安全的大小写转换 |
mb_convert_case($s, $mode [, $enc]) |
MB_CASE_UPPER/LOWER/TITLE |
php
strtoupper('hello'); // 'HELLO'
ucwords('hello world'); // 'Hello World'
mb_strtoupper('αβγ', 'UTF-8'); // 'ΑΒΓ'(希腊字母也能转)
5. 去除空白与清理
| 函数 | 说明 |
|---|---|
trim($s [, $char]) |
去除首尾空白(或指定字符) |
ltrim($s) / rtrim($s) / chop($s) |
左 / 右去除(chop 是 rtrim 别名) |
mb_trim($s) / mb_ltrim($s) / mb_rtrim($s) |
(PHP 8.3) 多字节安全的 trim |
php
trim(" abc \t\n"); // 'abc'
trim('xxabcxx', 'x'); // 'abc'
// PHP 8.3 前多字节空白需用 preg_replace 或升级后直接用 mb_trim
6. 分割与连接
| 函数 | 说明 |
|---|---|
explode($d, $s [, $n]) |
按分隔符拆分为数组 |
implode($glue, $arr) / join($glue, $arr) |
数组合并为字符串 |
preg_split($p, $s [, $n] [, $flags]) |
正则分割(支持多字节边界) |
str_getcsv($s) |
解析 CSV 行 |
php
explode(',', 'a,b,c'); // ['a','b','c']
implode('-', ['a','b','c']); // 'a-b-c'
preg_split('/(?<=。)/u', $text); // 按中文句号切割(保留标点)
7. 填充与重复
| 函数 | 说明 |
|---|---|
str_pad($s, $len [, $pad] [, $type]) |
填充到指定字节长度 |
mb_str_pad($s, $len [, $pad] [, $type] [, $enc]) |
(PHP 8.1) 按字符填充(中文安全) |
str_repeat($s, $n) |
重复 $n 次 |
php
str_pad('5', 3, '0', STR_PAD_LEFT); // '005'
mb_str_pad('中', 3, '·', STR_PAD_RIGHT, 'UTF-8'); // '中··'
str_repeat('ab', 3); // 'ababab'
8. 比较
| 函数 | 说明 |
|---|---|
strcmp($a, $b) |
二进制安全比较(<0 / =0 / >0) |
strcasecmp($a, $b) |
不区分大小写 |
strnatcmp($a, $b) / strnatcasecmp |
自然顺序比较 |
strncmp($a, $b, $n) |
比较前 $n 个字符 |
substr_compare($s, $sub, $off [, $len] [, $cs]) |
比较子串 |
strcoll($a, $b) |
基于区域设置的比较 |
php
strcmp('apple', 'apply'); // 负值
strnatcmp('img2', 'img10'); // 负值(自然序:2 < 10)
substr_compare('hello', 'ell', 1, 3); // 0('ell' 匹配)
9. 格式化
| 函数 | 说明 |
|---|---|
sprintf($f, ...) / printf($f, ...) |
格式化输出(返回 / 直接打印) |
vprintf($f, $arr) / vsprintf($f, $arr) |
参数以数组传入 |
number_format($n [, $d] [, $dec] [, $th]) |
千分位 / 小数格式化 |
sscanf($s, $f, &...$vars) |
按格式解析字符串 |
money_format($f, $n) |
⚠️ 已废弃(PHP 7.4+),用 NumberFormatter 替代 |
php
sprintf('用户 %s 余额 %.2f', 'Andy', 12.5); // '用户 Andy 余额 12.50'
number_format(1234567.891, 2); // '1,234,567.89'
number_format(1234567.891, 2, ',', ' '); // '1 234 567,89'
10. 转义与编码(HTML / URL / Base64)
| 函数 | 说明 |
|---|---|
htmlspecialchars($s [, $flags] [, $enc]) |
转义 & " ' < >(输出 HTML 必用) |
htmlentities($s) |
转义所有 HTML 实体 |
html_entity_decode($s) |
反转义 |
strip_tags($s [, $allow]) |
去除 HTML/PHP 标签 |
addslashes($s) / stripslashes($s) |
添加 / 去除反斜杠(SQL 拼接勿用,应用预处理) |
urlencode($s) / urldecode($s) |
表单风格 URL 编码(空格 → +) |
rawurlencode($s) / rawurlencode |
RFC 3986 编码(空格 → %20,推荐) |
http_build_query($arr) |
数组 → 查询字符串 |
base64_encode($s) / base64_decode($s) |
Base64 编解码 |
bin2hex($s) / hex2bin($h) |
二进制 ↔ 十六进制 |
php
htmlspecialchars('<b>x</b>', ENT_QUOTES, 'UTF-8'); // '<b>x</b>'
rawurlencode('a b/c'); // 'a%20b%2Fc'
http_build_query(['a' => 1, 'b' => 'x y']); // 'a=1&b=x+y'
base64_encode('hi'); // 'aGk='
11. 哈希与密码
| 函数 | 说明 |
|---|---|
md5($s [, $raw]) / sha1($s [, $raw]) |
摘要(禁止用于密码存储) |
crc32($s) |
校验和(32 位整数) |
hash($algo, $s [, $raw]) |
通用哈希(支持 sha256/sha512 等) |
password_hash($pw, $algo) |
密码存储专用(默认 PASSWORD_DEFAULT = bcrypt) |
password_verify($pw, $hash) |
验证密码 |
password_needs_rehash($hash, $algo) |
判断是否需要重新哈希 |
php
hash('sha256', 'data'); // 64 位十六进制
$hash = password_hash('secret', PASSWORD_DEFAULT);
password_verify('secret', $hash); // true
// 切勿用 md5/sha1 存密码(可暴力破解),必须用 password_hash
12. 字符 / ASCII 转换
| 函数 | 说明 |
|---|---|
ord($c) |
字符 → ASCII 码(单字节) |
chr($c) |
ASCII 码 → 字符 |
mb_ord($c [, $enc]) / mb_chr($c [, $enc]) |
(PHP 7.2) 多字节字符 ↔ Unicode 码点 |
php
ord('A'); // 65
chr(65); // 'A'
mb_ord('中', 'UTF-8'); // 20013
mb_chr(20013, 'UTF-8'); // '中'
13. 其他实用函数
| 函数 | 说明 |
|---|---|
strrev($s) |
反转字符串(单字节,中文乱码 → 用自定义多字节反转) |
str_shuffle($s) |
随机打乱字符 |
str_repeat |
见 7 |
levenshtein($a, $b) |
编辑距离(拼写容错) |
similar_text($a, $b [, &$pct]) |
相似度 |
count_chars($s [, $mode]) |
字符出现频率统计 |
str_word_count($s [, $f]) |
英文单词计数 |
nl2br($s) |
换行符 → <br> |
wordwrap($s, $w [, $br] [, $cut]) |
按宽度折行 |
chunk_split($s, $len [, $eol]) |
按长度分块(常用于 Base64 输出) |
convert_uuencode($s) / convert_uudecode($s) |
uuencode 编解码 |
php
strrev('abc'); // 'cba'
levenshtein('kitten', 'sitting'); // 3
nl2br("line1\nline2"); // 'line1<br>\nline2'
14. 多字节(mb_)专题
中文 / 日文 / emoji 等必须走
mb_*(mbstring扩展,Webman 默认已启用)。
| 函数 | 说明 |
|---|---|
mb_strlen / mb_substr / mb_strcut / mb_str_split |
见 1 |
mb_strtolower / mb_strtoupper / mb_convert_case |
见 4 |
mb_trim / mb_ltrim / mb_rtrim |
见 5 |
mb_str_pad |
见 7 |
mb_ord / mb_chr |
见 12 |
mb_strpos / mb_stripos / mb_strrpos |
多字节安全的查找(参数顺序同 mb_substr) |
mb_strwidth($s) |
显示宽度(半角 1 / 全角 2,适合 UI 对齐) |
mb_substr_count($s, $n) |
子串出现次数 |
mb_convert_encoding($s, $to, $from) |
编码转换(如 GBK → UTF-8) |
mb_detect_encoding($s [, $list]) |
探测编码 |
mb_check_encoding($s [, $enc]) |
校验是否为合法编码 |
php
mb_strpos('中文测试', '测试', 0, 'UTF-8'); // 2(字符位置)
mb_strwidth('中文ab'); // 6(2+2+1+1)
mb_convert_encoding($gbk, 'UTF-8', 'GBK');
实战避坑要点
- 中文必用
mb_*:strlen/substr/strpos按字节处理,处理 UTF-8 中文会截断、乱码、定位错误。统一使用mb_strlen/mb_substr/mb_strpos。 strpos返回值判断:未找到返回false,找到可能返回0(如'hello'中找'h'),必须用===/!==或 PHP 8.0 的str_contains。- 输出 HTML 转义:所有用户可控内容输出到页面前用
htmlspecialchars($s, ENT_QUOTES, 'UTF-8'),防 XSS。 - 密码存储:绝不用
md5/sha1;统一password_hash()+password_verify()。 - SQL 拼接:禁止
addslashes拼接 SQL,使用 PDO 预处理 / 框架 DB 组件参数绑定(Webman 的support\Db)。 urlencodevsrawurlencode:路径片段用rawurlencode(空格%20),表单体用urlencode(空格+)。mb_trim需 8.3+:低版本多字节空白清理用preg_replace('/^\s+|\s+$/u', '', $s)。
PHP 版本新增对照
| 版本 | 新增字符串相关函数 |
|---|---|
| 7.2 | mb_ord()、mb_chr() |
| 7.4 | mb_str_split() |
| 8.0 | str_contains()、str_starts_with()、str_ends_with() |
| 8.1 | mb_str_pad() |
| 8.3 | mb_trim()、mb_ltrim()、mb_rtrim()、str_increment()、str_decrement() |
本文档为速查参考,完整函数签名与边界行为以 PHP 官方手册 为准。
评论 (0)
发表评论