【发布时间】:2016-05-17 14:53:50
【问题描述】:
我有一个日期(例如 yyyy-mm-dd hh:mm:ss),如果我们有一个完全匹配该模式或部分匹配该模式的字符串,我希望能够从一开始就返回 true结束。例如。 44 将匹配该模式,因为 44 将匹配 yy,但 -12 将不匹配,因为 - 不是有效的“y”字符。
我想到了一些不优雅的解决方案。我可以在这样的事情上做preg_match:
#^\d(\d(\d(\d(-)?)?)?)?$#
这只是根据年份执行部分匹配。它需要扩展以考虑月、日、小时、分钟等,但这应该显示想法 #1。
我也可以做类似...
$patterns = [
'',
'\d',
'\d\d',
'\d\d\d',
'\d\d\d\d',
'\d\d\d\d-',
...
];
isset($patterns[strlen($str)] && preg_match('#^' . $patterns[strlen($str)] . '$#', $str)
但这似乎也有点令人费解。
我也可以这样做:
switch (strlen($str)) {
case 1: return preg_match('#^\d$#', $str);
case 2: return preg_match('#^\d\d$#', $str);
case 3: return preg_match('#^\d\d\d$#', $str);
case 4: return preg_match('#^\d\d\d\d$#', $str);
case 5: return preg_match('#^\d\d\d\d-$#', $str);
...
}
但这似乎也很臃肿。
换句话说,我正在寻找2005- 将返回true 的函数,2 和2005-1 也将返回true。但-2005 将返回 false,205- 或 neubert 也将返回 false。
我希望能够将有效值传递给 SQL 查询。例如。 WHERE date_column LIKE '$str%'。如果 date_column 是 DATETIME,那么搜索 -12- 是浪费时间,因为 date_column 不可能将其作为值。
有什么想法吗?
【问题讨论】:
-
我在我的模式中使用
^和$。我的第一个和preg_match通话中的第二个一样。$patterns数组在#^和$#之间连接。 -
你能为上述模式添加一些有效和无效的输入吗?
-
@anubhava - 我已经更新了我的帖子。
-
2005-1的长度为 6,2005-12的长度为 7,我认为两者都是有效的,但不会被现有模式覆盖 -
@anubhava - 没错。为简洁起见,我没有完全扩展这些模式。