PHP正则表达式:从理论到实践
\n\n正则表达式(regex或regexp)是一种强大的工具,用于根据指定模式搜索、替换和验证字符串。在PHP中,它们通过PCRE(Perl兼容正则表达式)函数集实现,能够解决从电子邮件验证到HTML解析的各种复杂任务。在本文中,我们将解析语法、主要函数,并介绍每个PHP开发人员都会用到的实用示例。
\n\n1. PHP正则表达式语法基础
\n\nPHP中的任何正则表达式都包含在分隔符中(通常为斜杠/)。在结束分隔符之后,可以指定修饰符——用于改变搜索行为的标志。
$pattern = '/模式/修饰符';\n\n基本元字符:
\n- \n
.— 任意单个字符(换行符除外) \n *— 前一个字符的零次或多次重复 \n +— 一次或多次重复 \n ?— 零次或一次重复(使量词变为懒惰模式) \n ^— 字符串开头 \n $— 字符串结尾 \n \\d— 数字(0-9) \n \\w— 字母、数字或下划线 \n \\s— 空白字符 \n []— 字符类(例如[a-z]) \n ()— 捕获组 \n
常用修饰符:
\n- \n
i— 不区分大小写的搜索 \n m— 多行模式(^和$作用于每一行) \n u— UTF-8支持(处理西里尔字母时必需) \n s— 点号也匹配换行符 \n
2. preg_match()函数:搜索匹配项
\n\npreg_match()是最常用的函数。它检查字符串是否与模式匹配,并返回1(匹配)或0(不匹配)。第三个参数是一个数组,用于存储找到的匹配项。
示例1. 验证电子邮件地址
\n<?php\n$email = "user@example.com";\n$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/';\n\nif (preg_match($pattern, $email)) {\n echo "电子邮件有效";\n} else {\n echo "电子邮件无效";\n}\n// 输出:电子邮件有效\n?>\n\n示例2. 从字符串中提取数据
\n<?php\n$text = "我的号码:+7 (999) 123-45-67";\n$pattern = '/\\+7\\s*\\(\\d{3}\\)\\s*\\d{3}-\\d{2}-\\d{2}/u';\n\nif (preg_match($pattern, $text, $matches)) {\n echo "找到号码:" . $matches[0];\n}\n// 输出:找到号码:+7 (999) 123-45-67\n?>\n\n注意:如果字符串中包含西里尔字母或Unicode特殊字符,则必须使用修饰符u。
3. preg_replace()函数:按模式替换
\n\npreg_replace()在字符串中查找所有与模式匹配的内容,并将其替换为指定的文本。可以使用捕获组$1、$2等来插入原始文本的部分内容。
示例3. 格式化电话号码
\n<?php\n$phone = "89991234567";\n$pattern = '/(\\d{1})(\\d{3})(\\d{3})(\\d{2})(\\d{2})/';\n$replacement = '+7 ($2) $3-$4-$5';\n\n$formatted = preg_replace($pattern, $replacement, $phone);\necho $formatted; // +7 (999) 123-45-67\n?>\n\n示例4. 清理HTML标签(保留允许的标签)
\n<?php\n$html = "<b>粗体</b> <script>alert('xss')</script> 文本";\n$pattern = '/<\\s*\\/?\\s*(?!b|i|u|a\\b)[^>]*>/ui';\n\n$clean = preg_replace($pattern, '', $html);\necho $clean; // <b>粗体</b> 文本\n?><