在 laravel 上使用正则表达式验证日期时间

Validating datetime using regex on laravel

Laravel 正则表达式日期验证没有像我预期的那样工作,正则表达式应该在时间部分匹配 09:00:0016:00:00 是一个 iso 日期时间,但是它给出了一个内部服务器错误:

$validator = Validator::make($request->all(), [
            'datetime'  => 'required|date|after:tomorrow|regex:/((0[9]|1[0-5]):[0-5][0]:00)|(16:00:00)$/g',
            'subject'   => 'required|max:255',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status'    => '500',
                'success'   => 'false',
                'error'     => $validator->messages()
            ]);
        }

如果我在没有正则表达式的情况下再次尝试,验证会按预期工作并且它将插入日期时间字段,我怀疑它正在尝试将正则表达式与日期对象而不是它的字符串表示相匹配,但我没有知道从这里去哪里文档没有详细介绍正则表达式。

理想情况下,我希望它显示 'Enter a time between 9am and 4pm, on the hour only' 行的错误消息,而不仅仅是失败。

谢谢

来自 the documentation(强调我的):

Note: When using the regex pattern, it may be necessary to specify rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character.

所以,试试这个:

$validator = Validator::make($request->all(), [
     'datetime'  => [
         'required',
         'date',
         'after:tomorrow',
         'regex:/((0[9]|1[0-5]):[0-5][0]:00)|(16:00:00)$/',
     ],
     'subject'   => 'required|max:255',
]);

注意: 我删除了 g 标志,因为它是不必要的.该表达式要么匹配,要么不匹配——无需全局查找所有匹配项。


至于更新 Validator class 返回的错误消息,您可以简单地 pass an array of messages as the 3rd param:

$validator = Validator::make($request->all(), [
     'datetime'  => [
         'required',
         'date',
         'after:tomorrow',
         'regex:/((0[9]|1[0-5]):[0-5][0]:00)|(16:00:00)$/',
     ],
     'subject'   => 'required|max:255',
], ['datetime.regex' => 'Custom regex error here.']);