【问题标题】:@QueryParam requirements regex not working as expected@QueryParam 要求正则表达式未按预期工作
【发布时间】:2017-01-21 03:53:53
【问题描述】:

我有一个简单的 API 端点设置如下:

/**
 *
 * @QueryParam(name="originLat", requirements="\d+", strict=true, nullable=false)
 * @QueryParam(name="originLng", strict=true, nullable=false)
 * @QueryParam(name="departureTime", requirements="/\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d/", strict=true, nullable=false)
 *
 * @param ParamFetcher $paramFetcher
 */
public function getWalkingJourney(ParamFetcher $paramFetcher)
{
    $dTime = $paramFetcher->get('departureTime');
    $oLat = $paramFetcher->get('originLat');
    $oLng = $paramFetcher->get('originLng'),
}

如果我传递一个简单的数字,originLat 的 [QueryParam][1] 可以正常工作,但更复杂的离开时间正则表达式总是失败并显示以下消息:

Parameter "departureTime" of value "2016-09-13 14:47:36" violated a constraint "Parameter 'departureTime' value, does not match requirements '/\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d/'"

这似乎违反直觉,因为这是正确的正则表达式。

我在这里做错了吗?

【问题讨论】:

  • QueryParam 正则表达式可以指定为字符串。无需附在/

标签: php symfony fosrestbundle queryparam


【解决方案1】:

您在requirements 中添加PCRE delimiters,这可能会弄乱您的正则表达式。

试试* @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)

【讨论】:

  • 不幸的是问题仍然存在:值“2016-09-13 15:05:01”的参数“departureTime”违反了约束“参数'departureTime'值,不符合要求'\d{ 4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d'"
  • 好吧,正则表达式会验证您提供的示例输入。问题可能在于输入不是您认为的那样。在输入上使用var_dump() 以进一步检查它。那里可能有一些您没有注意到的空白,因为您可能正在浏览器中查看它,或者您在控制台中看不到一些不可打印的字符。 var_dump() 会给你字符串长度,所以这会变得更加明显。
  • 我正在做 TDD,所以我正在控制正在发生的事情。我也在使用 xdebug,所以我可以看到控制器中的变量与预期的一样。出于某种原因,这似乎是单个空格的问题。
  • 可能是 Symfony 组件在您的正则表达式but the regex itself and the input provided definitely validate as far as PHP is concerned 中转义内容的方式的问题。
【解决方案2】:

这里的问题是空间问题。注释不能很好地处理空格,所​​以当正则表达式中的空格被替换为 \s 时,一切正常。

不起作用

 * @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d [0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)     *

作品

 * @QueryParam(name="departureTime", requirements="\d{4}-[01]\d-[0-3]\d\s[0-2]\d:[0-5]\d:[0-5]\d", strict=true, nullable=false)     *

【讨论】:

  • 这听起来像是 Symfony 的严重失误。解析文档块很简单。它内置在 PHP 中。但是不知道如何正确处理注释中的引用字符串的解析......老实说,Symfony 在编程 101 时失败了。
  • 同意。我将代码跟踪到他们的验证库,在那里它操纵正则表达式、附加和前置字符。我不完全确定它在那里做什么,我不是正则表达式专家,但在验证之前它绝对不会保持纯净。
  • 报告一个针对教义/注释的错误,如果它被检测为该实现中的错误。写个测试用例好像很简单,见github.com/doctrine/annotations/tree/…
  • 提出了这个错误。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多