点号.默认不匹配换行符;加s修饰符或用[ss]可匹配所有字符;匹配字面句号须转义为.;其贪婪性由后续量词(如、?)决定,自身无贪婪属性;拼接变量时需用preg_quote转义。

点号 . 默认不匹配换行符
在 PHP 的 PCRE 正则中,. 表示「除换行符
外的任意单个字符」。它不是“任意字符”的完全等价物,这是最常被忽略的前提。
常见错误现象:preg_match('/a.b/', "a
b") 返回 false,因为中间的换行符跳过了匹配;但 preg_match('/a.b/s', "a
b") 成功——关键就在末尾的 s 修饰符。
-
s(single-line mode)让.可匹配,本质是切换了点号的字符集范围 - 不用
s时,想真正匹配“所有字符”,得用[sS]或[dD]这类自制通配写法 -
.本身不带量词,单独出现只匹配一次;它的“贪婪性”来自后续量词,比如.*才会吞掉尽可能多的非换行内容
. 和 . 完全是两回事
点号是元字符,不是字面量。要匹配真实的句号字符(比如域名中的 .、小数点、文件后缀),必须转义。
常见错误现象:写 /file.txt/ 想匹配字符串 "file.txt",结果却匹配到了 "fileatxt" 或 "file#txt"——因为 . 被当成了通配符。
- 匹配字面句号,必须写成
.,例如/file.txt/ - 在双引号字符串中定义正则时,注意 PHP 层还要吃掉一层反斜杠:
"/file\.txt/" - 方括号内
[.]是安全的,不需要转义(字符组中大多数元字符失去特殊含义)
.* 和 .*? 的区别跟点号无关,只跟量词有关
. 本身没有“贪婪”或“非贪婪”属性;是 * 和 *? 决定了重复行为。
常见错误现象:用 /start.*end/ 去匹配 "start a end b end",结果整个字符串被一锅端,只捕获到一个超长匹配,而不是第一个 end 就停。
-
.*→ 贪婪:尽可能多吃字符,直到无法继续满足后续模式 -
.*?→ 非贪婪:一旦满足后续模式(如后面的end),立刻停止 -
.?是另一回事:它表示「匹配 0 个或 1 个任意字符」,不涉及重复次数选择,谈不上贪不贪婪
PHP 中点号容易和字符串拼接混淆
PHP 里 . 同时是字符串连接运算符,和正则里的 . 完全无关。混用时容易误判语法位置。
常见错误现象:写 $pattern = "/hello." . $suffix . "/";,本意是拼接变量,但如果 $suffix 含有未转义的正则元字符(比如 "world+"),就会导致意外匹配或警告。
- 拼接正则时,优先考虑用
preg_quote($suffix, '/')对变量内容转义 - 避免在正则字面量里直接插变量;更安全的做法是把变量约束进字符组或锚定边界,例如
"/hello" . preg_quote($suffix, '/') . "world/" - 调试时可用
var_dump($pattern)确认最终生成的正则字符串是否符合预期
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











