PHP使用preg_match校验授权字符的正则表达式问题求助
问题修复方案
你原有代码存在三类问题,修复方案如下:
直接可用的修复后代码
// 逻辑:匹配到任何非授权字符即触发错误,和你原始需求逻辑完全一致 if (preg_match('&[^#{}()<>|_æ+@%.,?:;"~\\\\/=*$£€!^]+&', $input)) { $error = 1; }
关键修改&转义规则说明
- 分隔符优化:放弃使用和授权字符冲突的
#作为正则分隔符,改为使用授权字符中没有的&作为分隔符,避免分隔符和规则内字符冲突需要额外转义 - 字符串语法修复:使用单引号包裹整个正则表达式,避免规则内的双引号
"和PHP字符串边界冲突,无需额外转义双引号 - 正则元字符处理:
- 把授权字符中的
^移动到否定字符集的末尾,避免放在[^紧邻位置被识别为正则取反元字符,无需额外转义 - 授权字符中的反斜杠
\在PHP单引号字符串中需要写为\\\\,最终解析到正则规则中为单个\ - 其余
{/}/(/)/</>/|/+/*/$等常见元字符,放在[]字符集内部时不会被识别为元字符功能,无需额外转义
- 把授权字符中的
可选等效写法
如果你更习惯用“匹配整个输入全为合法字符”的逻辑校验,可使用以下等效代码:
// 逻辑:校验整个输入从开头到结尾全是授权字符,不符合则触发错误 if (!preg_match('&^[#{}()<>|_æ+@%.,?:;"~\\\\/=*$£€!^]+$&', $input)) { $error = 1; }
内容的提问来源于stack exchange,提问作者François Macchi
相关产品推荐
相关产品推荐

