【问题标题】:Laravel field validation with regexp使用正则表达式验证 Laravel 字段
【发布时间】:2021-08-15 15:37:55
【问题描述】:

我正在制作 API,但在使用指示订单的参数发出请求时找不到正确的验证规则。

他们可以要求结果的顺序可以是给定数量的值。例如,可能的值是:namepostalcodeage

并且该顺序可能是升序或降序,并可能导致如下请求:

https://www.example.com/api/v1/users?sort=name,-postalcode,-age

我正在尝试找到正确的验证规则,但到目前为止我还没有成功。

我面临的问题是- 字符和, 的可能串联以及字段必须在一些可能值中具有合适值的事实。也就是说,我不知道如何将规则放在一起:

$validation = Validator::make($request->all(),[
    'sort' => 'sometimes|regex:/(^-?+(name|postalcode|age)+(,)?+(-)?){1,}/',
]);

我猜规则是这样的:

  • 可以有一个可选的- 字符
  • 后跟以下值之一:namepostalcodeage
  • 后跟一个字符,(仅当它后面有一个字符时)
  • 所有这些都可以重复一次或多次。

请你帮我找出合适的验证规则应该是什么,或者至少给我一些指导。

非常感谢您。

【问题讨论】:

  • 用数组代替怎么样:https://www.example.com/api/v1/users?sort[]=name&sort[]=-postalcodesort[]=-age 这样可以大大简化验证
  • 就我个人而言,我不会费心去验证你现在的样子。我会有一个可接受的字段列表,并且忽略发送的任何不在列表中的选项。
  • @shaedrich 感谢您的说明,但我想让用户尽可能方便地输入这些参数。
  • @Peppermintology 感谢您的提示,但我认为这不是一个好主意。认为查询可以连接多个值,以不同的书写顺序和可能的减号。总的来说,组合的数量会非常多。
  • @cooper 你误会了。我并不是建议您创建一个所有可能组合的列表,只是一个 accepted 字段名称列表,您可以使用它来比较传入的值。如果它不在列表中,请忽略它而不是抛出验证错误。

标签: regex laravel validation


【解决方案1】:

你可以使用

$validation = Validator::make($request->all(),[
    'sort' => [
        'sometimes',
        'regex:/^(-?(?:name|postalcode|age))(?:,(?1))*$/'
     ],
]);

请参阅regex demo

详情

  • ^ - 字符串开头
  • (-?(?:name|postalcode|age)) - 第 1 组:
    • -? - 一个可选的-
    • (?:name|postalcode|age) - 列出的单词之一
  • (?:,(?1))* - 逗号和第 1 组模式的零次或多次重复
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多