createFromFormat返回不一致(PHP)

createFromFormat返回不一致(PHP),php,Php,这是有效的(请注意单个数字“.3”) 此操作失败(请注意两位数“.33”: 这对我来说毫无意义。为什么*在这种情况下不成功 以下内容也适用于这个特定的示例,但我无法使用它,因为版本号可能有两位数 $date = DateTime::createFromFormat("*-*-*.*.??-Y-m-d-H?i.*", "backup-bla-3.3.33-2019-08-23-21h16.7z"); 使用*时失败的原因很清楚: 随机字节,直到下一个分隔符或数字 您在一行中有两个数字3和3,因此当

这是有效的(请注意单个数字“.3”)

此操作失败(请注意两位数“.33”:

这对我来说毫无意义。为什么
*
在这种情况下不成功

以下内容也适用于这个特定的示例,但我无法使用它,因为版本号可能有两位数

$date = DateTime::createFromFormat("*-*-*.*.??-Y-m-d-H?i.*", "backup-bla-3.3.33-2019-08-23-21h16.7z");

使用
*
时失败的原因很清楚:

随机字节,直到下一个分隔符或数字

您在一行中有两个数字
3
3
,因此当它到达第二个
3
时,您提供的格式不正确并导致错误

与之相反的是
**
??
,因为当您有一个单位数时,第二个
*
没有第二个字符可以匹配

使用可用的格式字符我看不出有任何解决方法。您的解决方案似乎是修改该值以删除年份之前的任何内容,然后使用
Datetime:createFromFormat()


这是根据“直到下一个分隔符或数字的随机字节”明确定义的行为。在createFromFormat之前,您必须使用正则表达式或类似的东西。类似于
$date=DateTime::createFromFormat(“Y-m-d-H?i”,preg_replace([^-]+-{3}([^.]+.$]),“$2”,“backup-bla-3.3.33-2019-08-23-21h16.7z”);
。如果字符串是“backup-bla-3.3.3333-2019-08-23-21h16.7z”;@MattRaines,正则表达式肯定可以改进。我更多地是为了概念而不是最终代码。如果有机会,我会解决这个问题。
$date = DateTime::createFromFormat("*-*-*.*.*-Y-m-d-H?i.*", "backup-bla-3.3.33-2019-08-23-21h16.7z");
$date = DateTime::createFromFormat("*-*-*.*.??-Y-m-d-H?i.*", "backup-bla-3.3.33-2019-08-23-21h16.7z");
$parts = preg_split('/(?=\d{4})/', 'backup-bla-3.3.3-2019-08-23-21h16.7z', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$date = DateTime::createFromFormat("Y-m-d-H?i.*", $parts[1]);
echo $date->format('c');