Laravel 5.5中numeric/integer验证如何仅接受纯数字(排除+/-)
Laravel 5.5 纯数字字符校验调整方案
原有规则失效的原因
Laravel 内置的numeric、integer规则采用兼容型数值判定逻辑:只要字段内容可以合法转换为PHP可识别的数字类型,就会通过校验。类似+1234、-5678这类带正负号的字符串,转换后属于合法数值,因此会被规则放行,无法匹配“仅由0-9字符组成、无其他符号”的校验需求。
调整实现方式
最直接可控的校验方案是使用Laravel内置的regex正则规则,强制校验字段的字符范围。
规则代码示例
将原有验证规则替换为以下写法:
$validated = Validator::make($request->all(), [ 'main_telephone' => 'regex:/^[0-9]+$/', 'main_fax' => 'regex:/^[0-9]+$/', 'direct_telephone' => 'regex:/^[0-9]+$/', 'mobile' => 'regex:/^[0-9]+$/', ]);
正则匹配规则说明:
^匹配字段内容的起始位置[0-9]限定仅允许0到9的标准ASCII数字字符+要求字段至少包含一个数字字符$匹配字段内容的结束位置
该规则会直接拦截所有包含+、-、小数点、空格、字母等非数字字符的输入,完全符合纯数字的校验要求。
配套错误提示优化
默认正则校验失败的提示语可读性较差,可以在验证逻辑中补充自定义提示:
$validated->setCustomMessages([ '*.regex' => '该字段仅支持输入0-9的纯数字内容,不允许包含符号、空格、加减号等其他字符', ]);
注意事项
- 不要使用
\d作为正则匹配规则,部分本地化配置环境下,\d会匹配其他语系的数字字符,无法保证仅匹配标准0-9字符 - 不要单独使用
digits规则作为替代,该规则的底层仍依赖数值类型转换判定,同样会放行带正负号的符合长度要求的输入 - 如果需要允许字段为空,可以在规则列表中前置
nullable规则,避免空值触发正则校验报错,比如写法为'mobile' => 'nullable|regex:/^[0-9]+$/'
内容的提问来源于stack exchange,提问作者Vaibhav Sidapara
相关产品推荐
相关产品推荐

