正则表达式是用来描述文本模式的小型语言:一句话就能表达"以 1 开头的 11 位数字"这类规则。PHP 通过 PCRE 系列函数(名字都以 preg_ 开头)提供正则支持,是表单验证、日志分析、批量替换的利器。
基本语法:定界符与常用元字符
PHP 正则要写在一对定界符里,习惯用 /,例如 /^hello/。常用元字符先记这一组:
| 元字符 | 含义 |
|---|---|
\d |
一位数字(0-9) |
\w |
字母、数字或下划线 |
+ |
前面的内容出现 1 次或多次 |
* |
出现 0 次或多次 |
? |
出现 0 次或 1 次 |
^ / $ |
字符串的开头 / 结尾 |
[abc] |
a、b、c 中的任意一个 |
preg_match:验证格式
preg_match('/模式/', 字符串) 返回 1(匹配)或 0(不匹配),最常用来做格式验证:
<?php
$phone = "13812345678";
// ^1 开头,后跟 10 位数字,共 11 位
var_dump(preg_match('/^1\d{10}$/', $phone)); // 输出:int(1)
$bad = "23812345678";
var_dump(preg_match('/^1\d{10}$/', $bad)); // 输出:int(0)
// 提取匹配内容:第 3 个参数传入数组
$date = "2026-09-26";
preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $m);
echo $m[1] . "年" . $m[2] . "月" . $m[3] . "日";
// 输出:2026年09月26日
?>
括号 ( ) 叫捕获组,匹配到的内容按顺序存进 $m[1]、$m[2]……$m[0] 是整个匹配。
preg_match_all:找出全部结果
preg_match 只找第一处,preg_match_all 会把所有匹配收进数组:
<?php
$html = "邮箱 [email protected],备用 [email protected]";
preg_match_all('/[\w.]+@[\w.]+/', $html, $all);
print_r($all[0]);
// 输出:
// Array
// (
// [0] => [email protected]
// [1] => [email protected]
// )
?>
preg_replace:批量替换
preg_replace('/模式/', '替换成', 字符串) 按模式查找并替换,支持用 $1、$2 引用捕获组:
<?php
// 把所有连续空格压成一个
$text = "hello world php";
echo preg_replace('/\s+/', ' ', $text);
// 输出:hello world php
// 给手机号中间四位打码
$phone = "13812345678";
echo preg_replace('/^(\d{3})\d{4}(\d{4})$/', '$1****$2', $phone);
// 输出:138****5678
?>
preg_split:按模式拆分
比 explode 更灵活,可以按多个分隔符拆:
<?php
$line = "苹果,香蕉; 橙子, 葡萄";
$items = preg_split('/[,;,]\s*/u', $line);
print_r($items);
// 输出:Array ( [0] => 苹果 [1] => 香蕉 [2] => 橙子 [3] => 葡萄 )
?>
模式末尾的 u 修饰符表示按 UTF-8 处理,处理中文时建议加上。
小结
本文介绍了 PHP 正则的四件套:preg_match 做验证与提取、preg_match_all 找出全部匹配、preg_replace 做模式替换、preg_split 按模式拆分。记住 \d、+、^$、[] 这几个高频元字符就能覆盖大部分场景;写复杂模式时先用小字符串在测试环境验证,再投入使用,避免"一个字符写错、全站数据遭殃"。
评论 0
还没有评论,来抢沙发吧~ 🛋