PHP的字符串函数库,就是一套用来折腾文本的工具集。你可以拿它们做格式化、搜索、替换、切分,基本上日常开发里对字串的“增删改查”操作,这些函数都能兜住。要在网页里嵌入动态内容,比如用户输入的用户名、文章摘要、表单数据,字符串函数是绕不开的东西。
运行这些函数,需要PHP环境本身已经配好,Web 服务器用 Apache 或者 Nginx 都行,这个没什么讲究,能跑起来就行。下面按照功能分类,挑项目开发里真正常用的、值得细讲的函数来逐一拆解。
大小写转换函数:细节决定界面一致性
strtolower() 把整个字符串转成小写,strtoupper() 转成全大写。这两个在表单处理时用得特别多,比如说用户输入邮箱、验证码比对,统一转成小写再比较,能避免大小写差异导致的误判。
<?php
$userInput = 'ALan@EBINGOU.CN';
$normalized = strtolower($userInput);
echo $normalized; // 输出 alan@ebingou.cn
?>
ucfirst() 只把字符串首字母大写,别的字符保持原样,适合做句子开头矫正。lcfirst() 则是干反过来的事,首字母强制小写。ucwords() 把每个单词的首字母都大写,写文章标题或者用户全名展示时很管用。
<?php
$title = 'php string functions tutorial';
echo ucwords($title); // 输出 Php String Functions Tutorial
?>
个人习惯:拿 ucwords() 处理英文名字展示没问题,但中文环境下就别用了,因为它以空格判断单词边界,中文没空格,函数压根不起作用。遇到中英混合的情况,我通常会额外写个自定义处理逻辑,而不是硬套这些函数。
字符串反转与长度计算
strrev() 把字符串倒过来,看起来简单,但在一些需要反向对比的场景里能派上用场,比如检查回文。
<?php
$text = 'level';
if ($text === strrev($text)) {
echo '回文字符串';
}
?>
strlen() 返回字符串的字节长度,这里要特别注意PHP的非 Unicode 特性。处理纯英文或 ASCII 字符时,strlen() 和肉眼看到的字符数一致。但一旦涉及中文这类多字节字符,strlen() 返回的是字节数而不是字符数,必须改用 mb_strlen() 才能得到正确结果。
<?php
$cnText = '编程教程';
echo strlen($cnText); // 输出 12(UTF-8 下每个中文字符 3 字节)
echo mb_strlen($cnText); // 输出 4
?>
这个坑我早年踩过,做一个字符串截取功能,用 substr() 直接切中文字符串,结果页面上一堆乱码,后来才彻底习惯凡是涉及中文的字符串操作,优先考虑 mb_ 开头的多字节安全函数。
搜索与位置查找:找得快不如找得准
strpos() 定位子串首次出现的位置,区分大小写。stripos() 是它的不区分大小写版本。strrpos() 查找之后一次出现,strripos() 对应不区分大小写的反向查找。
<?php
$email = 'alan@ebingou.cn';
$atPos = strpos($email, '@');
echo $atPos; // 输出 4
?>
验证邮箱格式、提取域名这类任务里,strpos() 几乎是必用函数。strstr() 则返回从找到的子串开始到末尾的部分,适合截取后缀。strchr() 是 strstr() 的别名。
还有个 strpbrk(),它在一组字符里找任何一个最先出现的位置,场景比较窄,但处理特殊分隔符时挺顺手。
字符串切分与拼接:explode 和 implode 的日常
explode() 按分隔符把字符串拆成数组,implode()(别名 join())把数组元素用连接符拼回字符串。这两个函数构成PHP里结构化数据与字符串互转的基本功。
<?php
$courseTags = 'PHP,字符串,函数,教程';
$tagsArray = explode(',', $courseTags);
print_r($tagsArray);
// 输出 Array ( [0] => PHP [1] => 字符串 [2] => 函数 [3] => 教程 )
$recombined = implode(' | ', $tagsArray);
echo $recombined; // 输出 PHP | 字符串 | 函数 | 教程
?>
str_split() 直接把字符串按长度拆成字符数组,不指定长度就每个字符一个元素。strtok() 按分隔符逐个遍历字符串,处理 CSV 或自定义分隔的流水数据时,比 explode() 更省内存,因为它用指针移动的方式逐个返回片段。
格式化输出与空白处理
trim() 去掉字符串首尾的空白或指定字符,拥有左右开弓的两个兄弟 ltrim() 和 rtrim()(chop() 是 rtrim() 的别名)。表单提交的用户名、密码,保存前通常都会 trim() 一趟,免得前端留白的空格被当成有效字符存进去。
<?php
$rawName = ' PHP 教程 ';
echo trim($rawName); // 输出 "PHP 教程"
?>
nl2br() 把字符串里的换行符 \n 转成 HTML 的 <br> 标签。做留言板、文章正文展示时,如果不走这个函数,用户敲的换行在网页上是看不出来的。
sprintf() 和 printf() 提供格式化字符串的能力,比直接拼接变量更灵活,尤其是在需要补零、控制小数位数、对齐文本的时候。
<?php
$courseId = 42;
echo sprintf('课程编号:%04d', $courseId); // 输出 课程编号:0042
?>
number_format() 给数字加千位分隔符,做价格显示必备。money_format() 专门格式化为货币形式,不过这个函数在 Windows 平台和部分PHP版本上有局限,我更习惯直接用 number_format() 加上手动拼接货币符号,跨平台省心。
替换与清理
str_replace() 做简单的字符串替换,区分大小写;str_ireplace() 对应不区分大小写的版本。substr_replace() 则能在指定位置替换子串,更精细。
strip_tags() 把字符串里的 HTML 和PHP标签剥掉,做内容安全过滤时是前端的一道防线。可以用第二个参数指定允许保留的标签。
<?php
$htmlContent = '<p>欢迎学习<b>PHP</b>教程</p>';
echo strip_tags($htmlContent, '<b>');
// 输出 欢迎学习<b>PHP</b>教程
?>
str_pad() 给字符串填充到指定长度,做编号补全、文本对齐挺实用。str_repeat() 重复一个字符串若干次,做占位符或者分割线时简单粗暴。
编码与哈希
md5() 和 sha1() 分别计算字符串的 MD5 和 SHA-1 哈希,适合做简单的校验、非安全场景的指纹生成。但要注意,这两个哈希算法已经不被推荐用于密码存储,密码哈希应使用 password_hash() 和 password_verify() 这对专用函数。crc32() 生成 32 位循环冗余校验值,比 md5() 快,但碰撞风险高,通常只拿来做内部数据校验。
bin2hex() 把 ASCII 字符转成十六进制字符串,hex2bin() 反过来。处理二进制数据与字符串互转时这俩很管用。
HTML 实体处理
htmlspecialchars() 把特殊字符(如 <、>、&、"、')转成 HTML 实体,防止 XSS 攻击,是输出到 HTML 页面时的标准操作。htmlentities() 转换范围更大,把能用实体表示的字符全转了。对应的解码函数是 htmlspecialchars_decode() 和 html_entity_decode()。
<?php
$userInput = '<script>alert("XSS")</script>';
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 输出 <script>alert("XSS")</script>
?>
每次把用户提供的内容输出到页面,不用多想,直接套 htmlspecialchars() 就对了。这个习惯养成之后,很多潜在的安全问题会在源头被化解。
本节课程知识要点
字符串函数的选型,核心看场景。大小写转换作输入规范化,trim() 类函数清空白,explode() 和 implode() 负责结构化转换,htmlspecialchars() 确保输出安全。处理中文等多字节字符时,必须配套 mb_ 系列函数,避免字节和字符概念混淆带来的隐蔽 bug。MD5 和 SHA1 不再用于密码场景,已由 password_hash() 替代。工作中如果有函数记不清参数顺序,直接查官方手册比死记硬背更靠谱,熟练使用文档本身是开发者一项被低估的能力。