我试图从文件file-2018-02-19-second.json
捕获日期。
我正在使用.*file-(..........).*.json
正则表达式捕获文件中的日期。正则表达式捕获文件中的2018-02-19
日期但我想忽略文件中的"-"
并且只捕获20180219
。我该怎么做?
如果您的文件名始终具有相同的格式,则可以使用DateTime::createFromFormat
将字符串转换为DateTime实例:
$date = DateTime::createFromFormat('*-Y-m-d-*.*', 'file-2018-02-19-second.json');
echo $date->format('Ymd');
您可以在php manual中找到不同的格式字符及其含义。
$fileName = 'file-2018-02-19-second.json';
preg_match('#([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))#is', $fileName,
$output);
if (!empty($output)) {
$date = preg_replace('#-#is', '', $output[1]);
echo $date;
}
希望可以帮到你!
<?php
$fn = 'file-2018-02-1-second.json';
$fn = preg_match('/.*file-\K\d{4}-\d{2}-\d{2}/', $fn, $o);
echo isset($o[0]) ? preg_replace('/\D+/', '', $o[0]) : 'No match found';
<?php
$fn = 'file-2018-02-1-second.json';
$fn = preg_match('/.*file-(\d{4})-(\d{2})-(\d{2})/', $fn, $o);
echo isset($o[1], $o[2], $o[3]) ? $o[1].$o[2].$o[3] : 'No match found';
.*file-\K\d{4}-\d{2}-\d{2}
.*
任意次数匹配任何字符file-
按字面意思对比\K
重置比赛的起点。最终匹配中不再包含任何先前消费的字符。\d{4}
恰好匹配任何数字4次-
按字面意思对比\d{2}
恰好匹配任何数字2次-
按字面意思对比\d{2}
恰好匹配任何数字2次第二种模式\D+
简单地匹配任何非数字字符一次或多次以进行替换。
最后一个模式(来自选项2)实际上只是我描述的第一个模式的简化版本,但是将每个数字部分组成捕获组。
结果:20180219
这个问题似乎只是关于数据提取,而不是关于数据验证。
代码:(Demo)
$file = 'file-2018-02-19-second.json';
$date = preg_replace('~\D+~', '', $file);
echo $date;
输出:
20180219
如果您需要稍微更准确/验证(利用file-
的位置,您可以使用\G
在压缩它们之前提取日期组件。
代码:(Demo)(Pattern Demo)
$file = 'somefile-2018-02-19-second.json';
echo preg_match_all('~\Gfile-\K\d+|-\K\d+~', $file, $out) ? implode($out[0]) : 'fail';
// same result as earlier method