【问题标题】:Custom Validation Pattern in LaravelLaravel 中的自定义验证模式
【发布时间】:2019-11-01 08:13:09
【问题描述】:

我在提供程序中有一个自定义验证功能。 如果用户输入的不是这些 [A, B , C 和 /],则返回错误。 目前该功能运行良好。 提前我想检查以下模式(只允许该模式)和非该模式,想要返回错误。

A
C
B
A/B
A/C
A/C/B
A/B/C
C/A
C/B
C/A/B
C/B/A
B/A
B/C
B/A/C
B/C/A
Validator::extend('capital_letter_abc_with_slash', function ($attribute, $value, $parameter, $validator) {
    return preg_match('/[ABC\/]/', $value) === 1;
});

【问题讨论】:

  • 可能是'~^(?!.*([ABC]).*\1)[ABC](?:/[ABC]){0,2}$~'?
  • A/B 出现两次,A/C 没有出现,是错字吗?
  • @kerbholz 是的,这是我的错,我更新了。
  • @WiktorStribiżew 感谢您的评论。它也可以正常工作。

标签: php regex laravel


【解决方案1】:

你的正则表达式应该是这样的:

preg_match('/^(?!.*(.)\/.*\1)[ABC](\/[ABC]){0,2}$/', $value);

这些字母不会重复

对于https://laravel.com/docs/5.8/validation#rule-regex

你可以这样做:

Validator::make($parameter, [
    'abc' => 'regex:/^(?!.*(.)\/.*\1)[ABC](\/[ABC]){0,2}$/'
]);

您可以在这里测试您的正则表达式: https://tsaikoga.github.io/it-tools/web/index.html#/regex-page

【讨论】:

  • 例如,A/A/A 将是有效的。据我了解,@hayato 需要防止这样的价值观
  • @TsaiKoga 感谢您的建议。正如 Roman 所说,A/A/A 对我来说不合适
  • 我已经修正了我的答案。这对我来说很好。@Hayato
【解决方案2】:

如果你有一组允许的值,我认为最简单的方法是将其放入数组并在验证规则中遍历它:

Validator::extend('abc', function ($attribute, $value, $parameter, $validator) {
    $allowedPatterns = [
        'A',
        'C',
        'B',
        'A/B',
        'A/B',
        'A/C/B',
        'A/B/C',
        'C/A',
        'C/B',
        'C/A/B',
        'C/B/A',
        'B/A',
        'B/C',
        'B/A/C',
        'B/C/A',
    ];

    foreach ($allowedPatterns as $pattern) {
        if ($value === $pattern) {
            return true;
        }
    }

    return false;
});

您可以将该数组存储在配置中、模型中,无论您需要什么。

【讨论】:

  • 感谢您的回答,我也感谢您的解决方案。这次让我使用带有模式的验证。 :)
猜你喜欢
  • 2016-10-29
  • 2012-11-27
  • 2014-02-18
  • 2015-05-10
  • 1970-01-01
  • 2019-10-29
  • 2017-01-20
  • 2018-10-21
  • 2015-04-09
相关资源
最近更新 更多