PHP 正则表达式基础语法
PHP 中正则表达式主要通过 preg_
系列函数实现,核心模式需用定界符(如 /
)包裹。例如匹配数字的模式:
$pattern = '/\d+/'; // 匹配一个或多个数字
特殊字符需转义,例如匹配 .
需写成 \.
。常见元字符包括:
\d
:数字\w
:字母、数字或下划线\s
:空白字符.
:任意字符(除换行外)
常用匹配函数示例
preg_match()
用于单次匹配,返回匹配次数(0 或 1):
$text = "Order 12345";
if (preg_match('/Order \d+/', $text)) {
echo "订单号格式正确";
}
preg_match_all()
进行全局匹配,提取所有符合项:
$html = '<a href="link1.html">Link1</a><a href="link2.html">Link2</a>';
preg_match_all('/<a href="(.*?)">(.*?)<\/a>/', $html, $matches);
print_r($matches); // 输出所有链接和文本
捕获组与非捕获组
圆括号 ()
形成捕获组,匹配后可通过索引引用:
$date = "2023-12-31";
preg_match('/(\d{4})-(\d{2})-(\d{2})/', $date, $groups);
echo "Year: " . $groups[1]; // 输出 2023
若无需捕获,使用 (?:)
非捕获组提升性能:
preg_match('/(?:\d{4})-(\d{2})/', $date, $groups); // 仅捕获月份
模式修饰符应用
修饰符改变匹配行为,常见如下:
i
:不区分大小写m
:多行模式(^和$匹配行首行尾)s
:让.
匹配换行符
示例(大小写不敏感的匹配):
$text = "Hello WORLD";
preg_match('/world/i', $text, $match); // 匹配成功
替换与分割操作
preg_replace()
实现正则替换:
$text = "用户电话:123-4567-8901";
$masked = preg_replace('/(\d{3})-(\d{4})-\d{4}/', '$1-****-$2', $text);
echo $masked; // 输出 "用户电话:123-****-4567"
preg_split()
按正则分割字符串:
$csv = "apple, orange; banana|pear";
$fruits = preg_split('/[,;|]/', $csv); // 分割为数组
实用案例:表单验证
验证邮箱格式的正则示例:
$email = "user@example.com";
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
if (!preg_match($pattern, $email)) {
echo "邮箱格式无效";
}
URL 提取与参数分析:
$url = "https://example.com/page?id=123&lang=en";
preg_match('/^(https?:\/\/[^\/]+)(\/[^?]*)?\?(.*)$/', $url, $parts);
parse_str($parts[3], $params); // $params 包含 query 参数
性能优化技巧
避免贪婪匹配(使用 ?
转为懒惰模式):
// 贪婪匹配
preg_match('/<div>.*<\/div>/', '<div>A</div><div>B</div>', $match); // 匹配整个字符串
// 懒惰匹配
preg_match('/<div>.*?<\/div>/', $text, $match); // 仅匹配第一个 div
预编译模式提升重复匹配效率:
$pattern = '/\d{3}-\d{4}/';
$compiled = preg_quote($pattern, '/'); // 转义特殊字符
通过具体代码示例,可清晰掌握 PHP 正则表达式的核心功能与应用场景。实际开发中建议结合正则测试工具(如 regex101)验证模式有效性。