@QueryParam要求正则表达式工作不正常

问题描述:

我已成立了一个简单的API终点如下:@QueryParam要求正则表达式工作不正常

/** 
* 
* @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'), 
} 

的[QueryParam] [1] originLat工作正常,如果我通过一个简单的数字,但更复杂的正则表达式departureTime总是失败,出现以下消息:

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/'" 

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

我在这里做错了什么?

+0

的'QueryParam'正则表达式可以被指定为一个字符串。不需要附加在'/' –

你在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)

+0

不幸的是,问题仍然存在:值“2016-09-13 15:05:01”的参数“departureTime”违反了一个约束“参数'departureTime'的值,不符合要求'\ d {4} - [01] \ d- [0-3] \ d [0-2] \ d:[0-5] \ d:[0-5] \ d'“ – JackalopeZero

+0

那么,正则表达式验证样本您提供的输入。问题可能存在于输入中,而不是您想象的那样。在输入上使用'var_dump()'来进一步检查它。您可能没有注意到某些空白,因为您可能正在浏览器中查看它,或者有一些无法在控制台中看到的非打印字符。 'var_dump()'会给你字符串的长度,所以这会变得更明显。 – Sherif

+0

我正在做TDD,所以我正在控制什么是经历。我也使用xdebug,所以我可以看到该变量在控制器中的预期。出于某种原因,这似乎是单个空间的问题。 – JackalopeZero

这里的问题是空间的问题。注释不能很好地处理空格,所​​以当正则表达式中的空格被\ 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)  * 
+1

听起来像是Symfony的一部分,然后就是一个严重的问题。解析docblock是微不足道的。它内置于PHP。但不知道如何正确处理解析注释中的引用字符串......这是** Symfony在编程101失败,说实话。 – Sherif

+0

同意。我跟着代码一直到他们的验证库,它操纵正则表达式,附加和预先考虑字符。我不完全确定它在那里做什么tbh,我没有正则表达式专家,但它直到验证点才绝对保持纯净。 – JackalopeZero

+1

如果在该实现中检测到该错误,则报告违反教条/注释的错误。编写一个测试用例似乎是微不足道的,请参阅https://github.com/doctrine/annotations/tree/f9cf50745a45cae4a55f35e7691d124c4d887e45/tests/Doctrine/Tests/Common/Annotations/Fixtures – Ocramius