使用preg_match验证企业名称时'与&符号匹配失效如何解决
问题根因
- 正则语法存在错误:原正则中括号内的
-位于À-ÿ和!之间,会被识别为范围匹配符而非字面量连字符,直接打乱匹配规则;同时原代码存在函数括号、正则引号未闭合的语法问题。 - 字符串转义冲突:用双引号包裹正则时,PHP会自动解析特殊字符和变量,干扰正则规则;如果传入的企业名称中
&和'被自动转为HTML实体编码&、',也会匹配失败。 - UTF-8适配缺失:正则包含
À-ÿ类多字节字符,未加u修饰符时preg_match会按单字节规则解析,导致多字节字符匹配异常。
修复后的完整代码
// 先把HTML实体编码的特殊字符转回原始字符 $businessname = htmlspecialchars_decode($businessname, ENT_QUOTES); // 执行校验 if (!preg_match('/^[0-9A-Za-zÀ-ÿ!@#$%.\'& -]*$/u', $businessname)) { echo "error"; }
修复说明
- 改用单引号包裹正则字符串,避免PHP双引号的自动转义、变量解析干扰正则规则
- 将连字符
-移到中括号末尾,不会被识别为范围匹配符,可正常匹配字面量连字符 - 新增
u修饰符,强制preg_match按UTF-8编码解析字符,适配多字节拉丁字符的匹配需求 - 单引号在单引号包裹的正则内加反斜杠转义即可正常匹配,
&无需额外转义直接写入规则即可 - 增加HTML实体解码步骤,解决表单提交时特殊字符被自动转成实体导致的匹配失败问题
内容的提问来源于stack exchange,提问作者Sinny14
相关产品推荐
相关产品推荐

