PHP String
String function reference: search, slice, replace, case, encoding.
Key PointsFor CJK text always use `mb_*`; `str_*` works on bytes.
Searching
| Function | Returns | Note |
|---|---|---|
| strpos | 首次出现的位置 | 找不到返回 false,用 === false 判断 |
| strrpos | 最后一次出现的位置 | 同上 |
| str_contains | 是否包含(bool) | PHP 8,最直观 |
| str_starts_with | 是否以…开头 | PHP 8 |
| str_ends_with | 是否以…结尾 | PHP 8 |
| substr_count | 出现次数 | 不重叠计数 |
| mb_strpos | 按字符定位 | 中文必用 |
PHP
<?php
$s = "Hello PHP, hello world";
var_dump(strpos($s, "hello"));
var_dump(strrpos($s, "hello"));
var_dump(str_contains($s, "PHP"));
var_dump(str_starts_with($s, "Hello"));
var_dump(str_ends_with($s, "world"));
var_dump(substr_count($s, "l"));Output
int(13)
int(13)
bool(true)
bool(true)
bool(true)
int(5)strpos returns 13 because it is case-sensitive — Hello does not match. Use stripos to ignore case.Slice and replace
PHP
<?php
$s = "Hello PHP";
echo substr($s, 6), "\n";
echo substr($s, -3), "\n";
echo substr($s, 0, 5), "\n";
echo substr_replace($s, "World", 6), "\n";
echo str_replace(["Hello", "PHP"], ["Hi", "PHP8"], $s), "\n";
echo str_ireplace("hello", "Hi", $s), "\n";
echo strtr("abc", ["a" => "1", "b" => "2"]), "\n";
echo ucwords("hello big world"), "\n";
echo lcfirst("Hello"), "\n";Output
PHP
PHP
Hello
Hello World
Hi PHP8
Hi PHP
12c
Hello Big World
hellostr_replace applies sequentially, so earlier results can be replaced again. strtr maps in one pass — better for encoding tables.
Padding and formatting
PHP
<?php
echo str_pad("7", 3, "0", STR_PAD_LEFT), "\n";
echo str_pad("7", 3, "-", STR_PAD_RIGHT), "\n";
echo str_pad("7", 5, "*", STR_PAD_BOTH), "\n";
echo str_repeat("ab", 3), "\n";
echo wordwrap("The quick brown fox", 10, "\n", true), "\n";
echo nl2br("a\nb"), "\n";
echo sprintf("%08.3f", 3.14159), "\n";Output
007
7--
**7**
ababab
The quick
brown fox
a<br />
b
0003.142Multibyte
PHP
<?php
$cn = "你好世界";
echo strlen($cn), "\n";
echo mb_strlen($cn), "\n";
echo mb_substr($cn, 1, 2), "\n";
echo mb_strpos($cn, "世"), "\n";
echo mb_strtoupper("straße"), "\n";
echo mb_convert_case("hello world", MB_CASE_TITLE), "\n";Output
12
4
好世
2
STRASSE
Hello Worldmb_strtoupper("straße") yields STRASSE — ß expands to two characters. Any code assuming length is preserved breaks here.Encoding conversion
PHP
<?php
$gbk = mb_convert_encoding("中文", "GBK", "UTF-8");
echo strlen($gbk), "\n";
$back = mb_convert_encoding($gbk, "UTF-8", "GBK");
echo $back, "\n";
// 检测编码(不可靠,只能作为参考)
echo mb_detect_encoding("中文", ["UTF-8", "GBK"], true), "\n";Output
4
中文
UTF-8mb_detect_encoding often guesses wrong on short strings — GBK and UTF-8 byte ranges overlap. Never use it for security decisions.查找
| 函数 | 返回 | 注意 |
|---|---|---|
| strpos | 首次出现的位置 | 找不到返回 false,用 === false 判断 |
| strrpos | 最后一次出现的位置 | 同上 |
| str_contains | 是否包含(bool) | PHP 8,最直观 |
| str_starts_with | 是否以…开头 | PHP 8 |
| str_ends_with | 是否以…结尾 | PHP 8 |
| substr_count | 出现次数 | 不重叠计数 |
| mb_strpos | 按字符定位 | 中文必用 |
PHP
<?php
$s = "Hello PHP, hello world";
var_dump(strpos($s, "hello"));
var_dump(strrpos($s, "hello"));
var_dump(str_contains($s, "PHP"));
var_dump(str_starts_with($s, "Hello"));
var_dump(str_ends_with($s, "world"));
var_dump(substr_count($s, "l"));Output
int(13)
int(13)
bool(true)
bool(true)
bool(true)
int(5)strpos($s, "hello") 返回 13 是因为区分大小写——前面的 Hello 大写 H 不匹配。要忽略大小写用 stripos。截取与替换
PHP
<?php
$s = "Hello PHP";
echo substr($s, 6), "\n";
echo substr($s, -3), "\n";
echo substr($s, 0, 5), "\n";
echo substr_replace($s, "World", 6), "\n";
echo str_replace(["Hello", "PHP"], ["Hi", "PHP8"], $s), "\n";
echo str_ireplace("hello", "Hi", $s), "\n";
echo strtr("abc", ["a" => "1", "b" => "2"]), "\n";
echo ucwords("hello big world"), "\n";
echo lcfirst("Hello"), "\n";Output
PHP
PHP
Hello
Hello World
Hi PHP8
Hi PHP
12c
Hello Big World
hellostr_replace 按顺序执行,前面的结果可能被后面的再替换一次。strtr 是一次性字符映射,适合做编码转换或敏感词替换。
填充与格式化
PHP
<?php
echo str_pad("7", 3, "0", STR_PAD_LEFT), "\n";
echo str_pad("7", 3, "-", STR_PAD_RIGHT), "\n";
echo str_pad("7", 5, "*", STR_PAD_BOTH), "\n";
echo str_repeat("ab", 3), "\n";
echo wordwrap("The quick brown fox", 10, "\n", true), "\n";
echo nl2br("a\nb"), "\n";
echo sprintf("%08.3f", 3.14159), "\n";Output
007
7--
**7**
ababab
The quick
brown fox
a<br />
b
0003.142多字节
PHP
<?php
$cn = "你好世界";
echo strlen($cn), "\n";
echo mb_strlen($cn), "\n";
echo mb_substr($cn, 1, 2), "\n";
echo mb_strpos($cn, "世"), "\n";
echo mb_strtoupper("straße"), "\n";
echo mb_convert_case("hello world", MB_CASE_TITLE), "\n";Output
12
4
好世
2
STRASSE
Hello Worldmb_strtoupper("straße") 返回 STRASSE(ß 变成两个 S),长度会变。任何假设「转换大小写后长度不变」的代码都会在这里出错。编码转换
PHP
<?php
$gbk = mb_convert_encoding("中文", "GBK", "UTF-8");
echo strlen($gbk), "\n";
$back = mb_convert_encoding($gbk, "UTF-8", "GBK");
echo $back, "\n";
// 检测编码(不可靠,只能作为参考)
echo mb_detect_encoding("中文", ["UTF-8", "GBK"], true), "\n";Output
4
中文
UTF-8mb_detect_encoding 对短字符串经常猜错,GBK 和 UTF-8 的字节范围有重叠。不要用它做安全判断,只在日志里做参考。