悠悠楠杉
网站页面
正文:
正则表达式是PHP开发中处理字符串的利器,但很多人面对复杂的模式匹配时仍会头疼。本文将通过10个真实场景,带你从基础到进阶掌握PHP正则匹配,所有代码均经过实战验证。
表单提交时,常需验证手机号格式(以中国大陆为例):
php
$phone = '13800138000';
if (preg_match('/^1[3-9]\d{9}$/', $phone)) {
echo '手机号格式正确';
} else {
echo '请输入11位有效手机号';
}
解析:^1[3-9]确保以1开头且第二位是3-9,\d{9}$匹配后续9位数字。
从富文本内容中提取所有图片地址:
php
$html = '
...
';
preg_match_all('/
]+src="([^"]+)"/i', $html, $matches);
print_r($matches[1]); // 输出: Array ( [0] => pic1.jpg [1] => pic2.png )
技巧:[^>]+匹配除>外的任意字符,避免贪婪匹配问题。
要求密码包含大小写字母、数字且长度8-20位:
php
$password = 'Pass1234';
if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,20}$/', $password)) {
echo '密码强度合格';
}
核心:使用正向预查(?=)分别验证小写、大写和数字的存在性。
匹配2-4个中文字符的姓名(不含特殊符号):
php
$name = '张三';
if (preg_match('/^[\x{4e00}-\x{9fa5}]{2,4}$/u', $name)) {
echo '姓名有效';
}
注意:必须添加u修饰符支持Unicode中文范围。
从URL中解析出查询参数:
php
$url = 'https://example.com/?id=100&name=test';
preg_match('/[?&]([^=]+)=([^&]+)/', $url, $params);
// $params[1]为参数名,$params[2]为值从Nginx日志中提取时间信息:
php
$log = '127.0.0.1 - - [10/Oct/2023:15:30:22 +0800]';
preg_match('/\[(.*?)\]/', $log, $time);
echo $time[1]; // 输出: 10/Oct/2023:15:30:22 +0800清理文本中的连续空格:
php
$text = "Hello World";
$result = preg_replace('/\s+/', ' ', $text);
// 输出: "Hello World"列出目录中所有.jpg文件:
php
$files = ['a.jpg', 'b.png', 'c.jpg'];
$jpgFiles = preg_grep('/\.jpg$/i', $files);
print_r($jpgFiles); // 输出: Array ( [0] => a.jpg [2] => c.jpg )数据脱敏处理:
php
$phone = '13800138000';
echo preg_replace('/(\d{3})\d{4}(\d{4})/', '$1****$2', $phone);
// 输出: 138****8000处理name[]=value格式的表单数据:
php
$input = 'user[name]=John&user[age]=30';
preg_match_all('/([\w]+)\[([\w]+)\]=([^&]+)/', $input, $matches);
/* 输出:
Array (
[0] => user[name]=John
[1] => user
[2] => name
[3] => John
) */