正则条件分组实现:按第二组存在与否限制第一组长度(PHP服务端校验)
带条件规则的PHP服务端校验正则实现方案
最终可用正则
/^(?:\d{6}-\d{5}|\d{8}|\d{11}|\d{13})$/
规则说明
正则采用分支互斥逻辑覆盖两种合法场景,同时加首尾锚定避免局部匹配:
^、$分别锚定字符串开头和结尾,要求整个字符串完全符合规则- 非捕获组
(?:)内的分支用|分隔,满足任意一个分支即为合法:- 分支1
\d{6}-\d{5}:匹配带横杠的场景,严格要求第一组6位数字、第二组5位数字,中间用横杠分隔 - 分支2-4
\d{8}|\d{11}|\d{13}:匹配不带横杠的纯数字场景,仅允许长度为8、11、13位
- 分支1
原有正则问题说明
你之前编写的([0-9]{6,})(-?)(([0-9]{5})?)+存在3个核心缺陷:
- 无首尾锚定,只要字符串局部符合规则就会判定为匹配
- 第一组用
{6,}无上限长度限制,没有区分有无横杠的场景 - 横杠和第二组均标记为可选,未做两种场景的互斥限制,导致大量非法用例被放过
PHP使用示例
$checkPattern = '/^(?:\d{6}-\d{5}|\d{8}|\d{11}|\d{13})$/'; $inputStr = '要校验的字符串'; if (preg_match($checkPattern, $inputStr)) { // 校验通过的业务逻辑 } else { // 校验失败的提示逻辑 }
内容的提问来源于stack exchange,提问作者Max Krizh
相关产品推荐
相关产品推荐

