PHP正则支持两种注释方式:一是启用x模式后用#写行尾注释并忽略空白;二是使用(?#...)内联注释。两者均不参与匹配,但需遵循各自语法规则,否则易导致匹配失败。

PHP本身不支持在正则表达式内部直接写普通注释,但可通过两种标准方式添加说明性内容:一种是启用 x 模式实现行内空白与 # 注释,另一种是使用 (?#...) 内联注释语法。两者适用场景不同,需按规则使用才有效。
x 模式:支持空格、换行和 # 行尾注释
开启 x 模式后,正则中的空白字符(空格、制表符、换行)会被忽略,# 后直到行末的内容也被当作注释处理。这是让长正则更易读的主流做法。
- 必须在修饰符末尾加
x,例如:/\d{4}-\d{2}-\d{2} # 匹配 YYYY-MM-DD 格式/x -
#只在字符类[]外、且未被转义时才生效;写在[a-z#]或\#中不会触发注释 - 想匹配实际空格,不能直接敲空格,得用
\s或[ ]显式表示 - 换行可自由换行排版,但注意逻辑分组和量词作用范围仍按语法结构计算
(?#...) 语法:无需开启模式的内联注释
这种写法是 PCRE 原生支持的注释方式,不依赖任何修饰符,括号内所有字符都不参与匹配,也不影响模式行为。
- 格式固定为
(?#你的说明文字),右括号必须存在,且不能嵌套 - 可插在任意位置,比如:
/te(?#匹配te)st/等价于/test/ - 适合在关键子表达式旁加简短提示,例如:
/(\d{4})(?#年)-(\d{2})(?#月)-(\d{2})(?#日)/ - 注释内容完全不参与匹配过程,也不会被引擎解析或校验
常见误用与避坑点
很多问题源于混淆了注释机制与普通字符处理规则,尤其在调试失败时容易忽略这些细节。
立即学习“PHP免费学习笔记(深入)”;
- 没加
x修饰符却写了#,结果把#当作字面量去匹配,导致找不到结果 - 在
x模式下误以为空格能自动匹配空白,其实它被忽略——真要匹配空格得写\s或[ ] -
(?#...)中混入未闭合括号,如(?#未结束,会导致整个正则语法错误 - 过度依赖注释而忽略逻辑分组,比如在
(?#注释)后漏掉必要的括号或量词,引发匹配范围偏差
HTML 注释提取中的注释写法示例
若需提取 <!-- ... --> 内容,结合注释能让模式更清晰:
/<!-- # 开始标记 (.*?) # 捕获任意内容(非贪婪) --> # 结束标记 /xs
这里 x 让空格和换行被忽略,s 让 . 能跨行匹配,# 后文字纯属说明,不影响运行。



















