PHP 正则表达式

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)验证模式有效性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值