验证用preg_match,提取用preg_match_all,切分用preg_split,替换用preg_replace;关键先明确需求是判断、提取、定位还是替换,再选函数,修饰符和编码必须匹配utf-8。

别从 preg_match 开始学,先搞清你到底要解决什么问题:是验证格式、提取多个值、替换内容,还是定位位置?选错函数,后面全白搭。
验证字符串是否符合规则,用 preg_match 就够了
它只找第一个匹配,返回 1(成功)、0(没找到)或 false(正则写错了)。适合做邮箱、手机号、订单号这类“对/错”判断。
- 不加
u修饰符时,中文字符可能被截断或完全不匹配;含中文必须写成/\x{4e00}-\x{9fa5}/u - 忽略大小写用
i,比如邮箱验证:/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i - 别在验证场景里用
preg_match_all—— 多余,还慢,且容易误判(比如一个字符串里有两处邮箱,但你只关心“有没有”,不是“有几个”)
要提取所有匹配项,必须用 preg_match_all 并注意 $matches 结构
默认返回的是 preg_pattern_order 结构:$matches[0] 是全部完整匹配,$matches[1] 是第一个捕获组的所有结果……这个结构对批量处理最友好。
- 加
PREG_SET_ORDER标志会改成“每行一个匹配”的结构:$matches[0][0]是第一个完整匹配,$matches[0][1]是它的第一个子组——适合循环处理每条记录 - 加
PREG_OFFSET_CAPTURE会把每个匹配结果变成[字符串, 字节偏移]数组,用于需要定位位置的场景(比如高亮、分段解析) - 如果正则里用了命名捕获组,比如
/(?<name>\w+):(?<value>\d+)/</value></name>,$matches['name']和$matches['value']会直接可用,比数字索引更安全
想按规则切开字符串,preg_split 比 explode 更灵活
当分隔符不固定(比如“逗号或分号或空格”),或者要保留分隔符本身时,preg_split 是唯一选择。
- 常用组合:
preg_split('/[\s,;]+/', $str, -1, PREG_SPLIT_NO_EMPTY)—— 按空白、逗号、分号任意组合切,自动过滤空项 - 想保留分隔符?加
PREG_SPLIT_DELIM_CAPTURE,并在正则里把分隔符括起来,比如preg_split('/([,;])/', $str, -1, PREG_SPLIT_DELIM_CAPTURE) - 注意:
$limit设为2时,只切第一刀,返回两个元素;设为1时,不切,返回整个字符串为一个元素
替换文本时,preg_replace 的后向引用最容易出错
用 $1、$2 引用捕获组内容没问题,但千万别混用 \1 和 $1;PHP 官方明确推荐用 $n 形式。
- 替换字符串里要字面量输出
$,得写成\$,否则会被当成变量或捕获引用 - 想替换前先计数?传第 5 个参数
&$count,调用后$count就是实际替换次数 - 批量替换多个模式时,
$pattern和$replacement都传数组,长度不一致会导致多余模式被替换成空字符串——务必对齐
真正卡住人的地方,从来不是语法记不住,而是没想清楚:我要的到底是“有没有”“有多少”“在哪”还是“改成啥”。选对函数比写对正则更重要;而写对正则,80% 的坑都出在修饰符漏加、UTF-8 编码没对齐、贪婪匹配没控制上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











