PHP正则表达式从入门到精通:完整学习路线

夜涛同学_4276

夜涛同学_4276

2026-09-23

702人浏览

原创

preg_match() 适用于“是/否”类格式校验,返回1/0/false,需注意锚定、修饰符、错误处理;preg_replace() 替换失效常因分隔符冲突、贪婪匹配或缺失u修饰符;应规避灾难性回溯、过度用.*及未限长问题。

php正则表达式从入门到精通:完整学习路线

preg_match() 是你验证字符串是否符合规则的第一道关卡,不是万能的,但绝大多数表单校验、格式判断场景,用它就够了——别一上来就写 preg_match_all() 或硬套捕获组。

什么时候该用 preg_match() 而不是其他函数

它只找第一个匹配,返回 1(成功)、0(没找到)或 false(出错),适合「是/否」类判断:

  • 邮箱、手机号、身份证号格式校验 —— 只需确认整体结构对不对,不需要提取子字段
  • 路由匹配(如 /user/(d+) 判断请求路径是否匹配某类接口)
  • 敏感词存在性检查(if (preg_match('/(密码|admin)/i', $input))

容易踩的坑:

  • 忘记加 ^$:比如 /d{6}/ 会把 "abc123456def" 也判为“6位数字”,实际你要的是完整6位 —— 应写成 /^d{6}$/
  • 误用修饰符:gpreg_match() 中无效(PHP 不支持 g 修饰符),全局匹配得换 preg_match_all()
  • 没处理 false:当 $pattern 语法错误(比如括号不配对),函数直接返回 false,而不是 0,用 === false 显式判断更安全

preg_replace() 替换时,为什么有时替换不生效

常见现象:写了 preg_replace('/old/', 'new', $str),但输出还是原字符串。原因往往不在逻辑,而在模式本身:

  • 未转义特殊字符:想替换字面量 https://,却写成 '/https://' —— 斜杠触发了定界符冲突,应改用其他分隔符,如 '#https?://#' 或转义 '/https?:\/\//'
  • 量词太“贪心”:如 /(<div>.*)/ 在含多个 <code>div 的 HTML 中,会跨标签匹配到最末尾的
;改用非贪婪 /(<div>.*?)/s + <code>s 修饰符(让 . 匹配换行)
  • 中文或 UTF-8 字符没加 u 修饰符:匹配中文时若漏掉 u,可能截断字节、导致空匹配或警告;正确写法如 '/你好/u'
  • 性能隐患:哪些正则写法会让 PHP 卡住

    灾难性回溯(Catastrophic Backtracking)不是理论风险,真实业务中常因一个用户输入就拖垮整个接口:

    PHP
    PHP

    编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

    下载
    • 嵌套量词组合:如 /(a+)+b/ 遇到 "aaaaaaaaaaaa!" 会指数级尝试回溯 —— 改用原子组 /(?>a+)b/ 或重构逻辑
    • 过度依赖 .*:尤其在长文本里做跨行提取,/(start).*?(end)/s/(start)[^e]*(?:e(?!nd)[^e]*)*(end)/ 更易失控;优先用否定字符类代替 .*?
    • 未限制重复次数:比如验证密码强度写成 /[a-z]+[A-Z]+[0-9]+/,看似合理,但面对超长乱码输入时 PCRE 引擎仍可能深度试探 —— 加上长度锚点或预判输入长度

    线上环境建议:对用户可控的正则输入(如管理后台的搜索规则配置),务必用 preg_quote($user_input, '/') 转义后再拼入模式。

    调试正则的最小可行方法

    别依赖在线工具测完就上线,PHP 本地验证才真实:

    • var_dump(preg_last_error_msg()) 查看最近一次正则调用的错误详情(PHP 7.2+)
    • 开启 PREG_OFFSET_CAPTURE 标志,确认匹配位置是否符合预期:preg_match('/d+/', $text, $m, PREG_OFFSET_CAPTURE)
    • 对复杂模式,先拆解测试:比如邮箱正则,分段验证 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ 各部分是否独立成立

    真正难的从来不是写出能跑的正则,而是写出在边界输入、编码混合、性能压测下依然稳定可靠的正则 —— 它需要你既懂 PCRE 引擎行为,又愿意为一行模式多花三分钟验证。

    php免费学习视频:立即使用
    踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

    相关文章

    PHP速学教程(入门到精通)
    PHP速学教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    php文件怎么打开
    php文件怎么打开

    打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

    2023.09.01

    9164

    6

    php怎么取出数组的前几个元素
    php怎么取出数组的前几个元素

    取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

    2023.10.11

    5541

    5

    php反序列化失败怎么办
    php反序列化失败怎么办

    php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

    2023.10.11

    2015

    5

    php怎么连接mssql数据库
    php怎么连接mssql数据库

    连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

    2023.10.23

    3448

    4

    php连接mssql数据库的方法
    php连接mssql数据库的方法

    php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

    2023.10.23

    4114

    6

    html怎么上传
    html怎么上传

    html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.03

    3231

    9

    PHP出现乱码怎么解决
    PHP出现乱码怎么解决

    PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.09

    4577

    8

    php文件怎么在手机上打开
    php文件怎么在手机上打开

    php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.13

    3562

    8

    sprintf函数用法详解
    sprintf函数用法详解

    sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

    2023.11.27

    11602

    4

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    零基础新手入门PHP教程
    零基础新手入门PHP教程

    共237课时 | 48.4万人学习

    新版php入门教程
    新版php入门教程

    共85课时 | 49.5万人学习

    李炎恢PHP视频教程第一季
    李炎恢PHP视频教程第一季

    共136课时 | 60.7万人学习