i修饰符使正则匹配忽略ASCII字母大小写,仅影响a-z/A-Z,对数字、符号、中文等无作用;需紧贴分隔符后书写,适用于URL、HTML标签等不敏感场景,禁用于密码Token等严格区分大小写的匹配。

i 修饰符表示忽略英文字母大小写,它只影响 a-z 和 A-Z,对数字、符号、中文完全无作用。
为什么加 i 后匹配行为就变了?
不加 i 时,/hello/ 只能匹配 "hello",无法匹配 "Hello" 或 "HELLO";加上后,正则引擎在比对字母时自动转为小写(或统一处理)再比较。
- 底层是 PCRE 的
PCRE_CASELESS标志生效 - 不影响非字母字符:比如
/a1b/i和/a1b/行为完全一样,因为1没有大小写 - 中文、emoji、Unicode 字符不受
i影响——PHP 的i仅针对 ASCII 字母
i 在 PHP 中的写法和常见错误
必须紧贴正则结束分隔符之后,不能插在中间或漏掉斜杠:
- ✅ 正确:
preg_match('/admin/i', $str)、preg_replace('#HTTP#i', 'https', $url) - ❌ 错误:
preg_match('/admin/i ', $str)(空格导致修饰符失效) - ❌ 错误:
preg_match('/admin/ i', $str)(空格在分隔符和i之间) - ❌ 错误:
preg_match('/admin/', $str, 'i')(把i当成第四个参数,实际会被忽略)
什么时候必须用 i,什么时候反而不该用?
典型适用场景是用户输入校验、URL 协议头识别、HTML 标签名匹配等对大小写不敏感的业务逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 需要:
preg_match('/^https?:\/\//i', $url)—— 允许匹配HTTP://、https://、HtTpS:// - 需要:
preg_match('/<div>]*>/i', $html) —— 匹配任意大小写的 <code><DIV>、<div> - 不该用:
base64_decode()前校验字符串是否含非法字符时,/[^A-Za-z0-9+/=]/本身已显式列出大小写范围,加i多余且易误导 - 不该用:匹配密码重置 Token 等严格区分大小写的标识符,
i会扩大匹配范围,造成逻辑漏洞
真正容易被忽略的是:同一个正则里混用 i 和字符类(如 [A-Z]),比如 /[A-Z]+/i 实际等价于 /[a-zA-Z]+/,但可读性差,还可能掩盖意图——这种写法不如直接写 /[a-zA-Z]+/ 来得清晰。



















