s修饰符需在正则末尾分隔符后小写书写,如/pattern/s,仅使.匹配包括换行符在内的所有字符,不影响^和$;错误写法如/s或漏写会导致报错或失效。

preg_match 里怎么加 s 修饰符
直接在正则表达式末尾的分隔符后面写 s 就行,比如 /pattern/s。PHP 的 preg_match、preg_match_all、preg_replace 都支持它。
常见错误是漏掉斜杠后的 s,或者误写成 /pattern/S(大小写敏感,必须小写)。
-
/hello.*world/s→ 能跨换行匹配hello到world -
/hello.*world/(没s)→.遇到换行就停,匹配失败 -
/hello.*world/iS→S是无效修饰符,会报PREG_BADMODIFIER错误
s 修饰符只影响点号(.),不影响 ^ 和 $
s 的作用很明确:让 . 匹配包括 \n 在内的所有字符。但它不会改变 ^ 和 $ 的行为——它们仍然只锚定整个字符串的开头和结尾,不是每行。
如果既要跨行匹配,又要按行处理起止(比如匹配某一行开头的 start 和该行结尾的 end),得组合用 ms:
-
/^start.*end$/ms→m让^/$匹配每行头尾,s让.跨行 -
/^start.*end$/s→.能跨行,但^和$还是只认整个字符串首尾,大概率不生效
不用 s 修饰符也能匹配换行,但不推荐
有人用 (.|\n) 或 [\s\S] 或 [^] 绕过 s,语法上可行,但可读性差、性能略低、易出错。
-
/(.|\n)*/→ 每次都要做分支判断,比/.*/s慢 -
/[\s\S]*/→ 看似覆盖全字符,但依赖字符集编码,某些 Unicode 边界场景可能漏匹配 -
/[^]*/→ 在 PCRE 中等价于“匹配所有”,但 PHP 文档未正式支持,兼容性存疑
除非你被老版本 PHP(s 最稳妥。
匹配失败时先检查换行符真实存在
有时候你以为文本含换行,实际是 \r\n、\r 或纯空格;s 修饰符只解决 . 的能力问题,不解决数据本身。
- 用
var_dump($text)看真实字节,确认有没有\n - 用
str_replace("\n", '\n', $text)把换行可视化输出 - Windows 文本常用
\r\n,s同样生效,无需额外处理
真正容易被忽略的是:正则写对了,s 也加了,但源字符串根本没换行——这种情况下再调修饰符也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











