Laravel 验证不适用于多字节字符

eyl*_*lay 6 php laravel

我有一个用户输入他的工作车间代码的输入,工作车间代码必须是 10 位数字。所以在我的验证中,我有:

$apply_data = $request->validate([
   'workshop_name' => 'required|string',
   'workshop_code' => 'required|string|digits:10',
]);
Run Code Online (Sandbox Code Playgroud)

现在当用户输入 1231231231 就可以了。但如果用户输入?????????? (10 个阿拉伯数字而不是英文数字)Laravel 将返回以下错误

工作车间代码必须是 10 位数字

我猜 laravel 正在使用strlen而不是mb_strlen,因为车间实际上是 10 位数字。

我怎样才能解决这个问题?

更新 Laravel 实际上使用的是 strlen 而不是 mb_strlen https://github.com/laravel/framework/blob/41ea7cc3bb898ff86505d3798d8acbb8992a0aad/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L414

apo*_*fos 1

根据我的评论,您可以通过使用正则表达式确定输入是 10 个 unicode 数字来实现此目的,如下所示:

$apply_data = $request->validate([
   'workshop_name' => 'required|string',
   'workshop_code' => [ 'required', 'string', 'regex:/^\p{N}{10}$/u' ],
], [ 
   'regex' => 'Workshop code must consist of 10 numbers'
]);
Run Code Online (Sandbox Code Playgroud)

\p{N}表示具有属性 N(数字)的 unicode 字符