You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:09:00