0%

PHP8 字符串相关函数:全面解析与实战示例

PHP8 字符串相关函数:全面解析与实战示例

字符串处理是 PHP 开发中的核心任务之一,无论是表单验证、数据格式化还是文本分析,都离不开字符串函数。PHP8 提供了丰富的字符串处理函数,涵盖字符串长度计算、大小写转换、查找替换、分割拼接等多种操作。本文将系统介绍常用的字符串函数及其在 PHP8 中的特性。

字符串基础操作函数

1. 字符串长度计算:strlen()

strlen() 用于获取字符串的长度(字节数),对于 ASCII 字符,一个字符占 1 字节;对于 UTF-8 编码的中文等多字节字符,一个字符占 3 字节。

1
2
3
4
5
6
7
8
<?php
$str1 = "Hello World";
echo strlen($str1); // 输出:11(11个ASCII字符)

$str2 = "你好,PHP";
echo strlen($str2); // 输出:12("你好,"是3个UTF-8字符,占9字节;"PHP"占3字节)
?>

注意:如需获取 UTF-8 字符串的字符数(而非字节数),应使用 mb_strlen()(多字节字符串函数)。

2. 字符串截取:substr()mb_substr()

  • substr():按字节截取字符串,适合单字节字符(如英文);
  • mb_substr():按字符截取多字节字符串(如中文),需启用 mbstring 扩展。
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$str = "Hello 世界";

// 按字节截取(substr)
echo substr($str, 0, 5); // 输出:Hello(截取前5字节)
echo substr($str, 6, 3); // 输出:世("世"占3字节)

// 按字符截取(mb_substr,需支持多字节)
echo mb_substr($str, 0, 6); // 输出:Hello (截取前6个字符)
echo mb_substr($str, 6, 2); // 输出:世界(截取从第6个字符开始的2个字符)
?>

3. 大小写转换:strtolower()strtoupper()

  • strtolower():将字符串转为全小写;
  • strtoupper():将字符串转为全大写;
  • ucfirst():将字符串首字母转为大写;
  • ucwords():将字符串中每个单词的首字母转为大写。
1
2
3
4
5
6
7
8
9
<?php
$str = "hello world";

echo strtoupper($str); // 输出:HELLO WORLD
echo strtolower($str); // 输出:hello world(原字符串已小写,无变化)
echo ucfirst($str); // 输出:Hello world
echo ucwords($str); // 输出:Hello World
?>

字符串查找与替换

1. 字符串查找:strpos()strrpos()

  • strpos($str, $needle):查找子串 $needle$str 中首次出现的位置(区分大小写);
  • strrpos($str, $needle):查找子串 $needle$str 中最后一次出现的位置(区分大小写);
  • 若未找到,返回 false(注意:位置可能为 0,需用 === 判断)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$str = "Hello PHP, I love PHP";
$needle = "PHP";

// 首次出现位置
$pos1 = strpos($str, $needle);
echo "首次出现位置:{$pos1}"; // 输出:首次出现位置:6

// 最后一次出现位置
$pos2 = strrpos($str, $needle);
echo "最后出现位置:{$pos2}"; // 输出:最后出现位置:18

// 未找到的情况
$notFound = strpos($str, "Java");
var_dump($notFound); // 输出:bool(false)

// 正确判断是否找到(避免0被当作false)
if (strpos($str, $needle) !== false) {
echo "找到子串";
}
?>

2. 字符串替换:str_replace()preg_replace()

  • str_replace($search, $replace, $str):简单字符串替换(非正则);
  • preg_replace($pattern, $replace, $str):正则表达式替换(支持复杂模式)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// 简单替换
$str = "I like apple, apple is good";
$newStr1 = str_replace("apple", "orange", $str);
echo $newStr1; // 输出:I like orange, orange is good

// 数组形式替换(多对多)
$search = ["red", "blue"];
$replace = ["green", "yellow"];
$newStr2 = str_replace($search, $replace, "red car and blue bike");
echo $newStr2; // 输出:green car and yellow bike

// 正则替换(移除所有数字)
$strWithNum = "abc123def456";
$newStr3 = preg_replace("/\d+/", "", $strWithNum);
echo $newStr3; // 输出:abcdef
?>

字符串分割与拼接

1. 字符串分割:explode()

explode($delimiter, $str, $limit) 按分隔符将字符串分割为数组,$limit 可选,限制返回数组的元素个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$str = "apple,banana,orange,grape";

// 基础用法
$fruits = explode(",", $str);
print_r($fruits);
// 输出:Array ( [0] => apple [1] => banana [2] => orange [3] => grape )

// 限制分割个数
$fruitsLimit = explode(",", $str, 2);
print_r($fruitsLimit);
// 输出:Array ( [0] => apple [1] => banana,orange,grape )

// 按空格分割句子为单词
$sentence = "Hello world this is PHP";
$words = explode(" ", $sentence);
print_r($words);
// 输出:Array ( [0] => Hello [1] => world [2] => this [3] => is [4] => PHP )
?>

2. 数组拼接为字符串:implode()

implode($glue, $array) 用分隔符 $glue 将数组元素拼接为字符串($glue 可选,默认空字符串)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$fruits = ["apple", "banana", "orange"];

// 用逗号拼接
$fruitsStr1 = implode(",", $fruits);
echo $fruitsStr1; // 输出:apple,banana,orange

// 用换行符拼接
$fruitsStr2 = implode("\n", $fruits);
echo $fruitsStr2;
// 输出:
// apple
// banana
// orange

// 无分隔符拼接
$fruitsStr3 = implode("", $fruits);
echo $fruitsStr3; // 输出:applebananaorange
?>

字符串修整与过滤

1. 去除首尾空白:trim()ltrim()rtrim()

  • trim($str):去除字符串首尾的空白字符(空格、换行符 \n、制表符 \t 等);
  • ltrim($str):仅去除左侧空白;
  • rtrim($str):仅去除右侧空白。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$str = " \tHello World\n ";

echo "原始长度:" . strlen($str) . "<br>"; // 原始长度:17(含空白)

$trimmed = trim($str);
echo "修整后:{$trimmed}<br>"; // 输出:修整后:Hello World
echo "修整后长度:" . strlen($trimmed); // 修整后长度:11(无空白)

// 去除指定字符(第二个参数可选)
$str2 = "###Hello###";
echo trim($str2, "#"); // 输出:Hello
?>

2. HTML 特殊字符处理:htmlspecialchars()htmlentities()

  • htmlspecialchars($str):将 HTML 特殊字符(如 <>&)转换为实体(如 <>&),防止 XSS 攻击;
  • htmlentities():转换所有可转换的字符实体(包括非 ASCII 字符)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$html = '<script>alert("XSS攻击")</script>';

// 转换HTML特殊字符
$safeHtml = htmlspecialchars($html);
echo $safeHtml;
// 输出:&lt;script&gt;alert(&quot;XSS攻击&quot;)&lt;/script&gt;
// 浏览器会显示为文本,而非执行脚本

// 还原实体(如需显示原始HTML)
$originalHtml = htmlspecialchars_decode($safeHtml);
echo $originalHtml; // 输出原始HTML代码(谨慎使用,可能有安全风险)
?>

PHP8 新增的字符串函数与特性

1. str_contains()(PHP8+)

判断字符串是否包含指定子串,返回 truefalse(替代 strpos() !== false 的写法)。

1
2
3
4
5
6
<?php
$str = "PHP8 is awesome";

var_dump(str_contains($str, "PHP8")); // bool(true)
var_dump(str_contains($str, "Java")); // bool(false)
?>

2. str_starts_with()str_ends_with()(PHP8+)

  • str_starts_with($str, $prefix):判断字符串是否以指定前缀开头;
  • str_ends_with($str, $suffix):判断字符串是否以指定后缀结尾。
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$filename = "document.pdf";
$url = "https://example.com";

// 判断前缀
var_dump(str_starts_with($url, "https")); // bool(true)
var_dump(str_starts_with($url, "ftp")); // bool(false)

// 判断后缀
var_dump(str_ends_with($filename, ".pdf")); // bool(true)
var_dump(str_ends_with($filename, ".txt")); // bool(false)
?>

多字节字符串函数(mbstring 扩展)

对于 UTF-8 等多字节编码的字符串(如中文、日文),需使用 mbstring 扩展提供的函数,避免因字节处理导致乱码。常用多字节函数:

函数 用途 对应单字节函数
mb_strlen($str, 'UTF-8') 计算字符数(而非字节数) strlen()
mb_substr($str, $start, $length, 'UTF-8') 按字符截取多字节字符串 substr()
mb_strpos($str, $needle, 0, 'UTF-8') 多字节字符串查找 strpos()
mb_strtolower($str, 'UTF-8') 多字节字符串转小写 strtolower()
1
2
3
4
5
6
7
8
9
10
11
<?php
$str = "你好,世界!";

// 对比字节数和字符数
echo "字节数:" . strlen($str) . "<br>"; // 字节数:18(每个中文占3字节)
echo "字符数:" . mb_strlen($str, 'UTF-8') . "<br>"; // 字符数:6

// 多字节截取
echo mb_substr($str, 0, 2, 'UTF-8'); // 输出:你好
?>

字符串函数最佳实践

  1. 处理多字节字符必用 mb_\* 函数:中文、日文等多字节字符串需使用 mb_strlen()mb_substr() 等,避免乱码;
  2. 用户输入先过滤:用 trim() 去除首尾空白,htmlspecialchars() 处理 HTML 特殊字符,防止 XSS 攻击;
  3. 优先使用 PHP8 新增函数str_contains()str_starts_with() 等函数更简洁,可读性更高;
  4. 正则替换需谨慎:复杂正则表达式可能影响性能,简单替换优先用 str_replace()
  5. 判断是否包含子串的正确方式:
    • PHP8+:str_contains($str, $needle)
    • 低版本:strpos($str, $needle) !== false(必须用 !==,避免 0 被误判为 false)。

总结

PHP8 提供了完善的字符串处理函数库,从基础的长度计算、截取,到复杂的查找替换、正则处理,覆盖了开发中的各种场景。掌握这些函数的用法,尤其是 PHP8 新增的 str_contains() 等便捷函数,以及多字节字符串的处理技巧,能显著提升字符串操作的效率和安全性。

欢迎关注我的其它发布渠道