我正在尝试从文件file-2018-02-19-second.json
中捕获日期。
我正在使用.*file-(..........).*.json
正则表达式捕获文件中的日期。正则表达式在文件中捕获2018-02-19
日期,但我想忽略文件中的"-"
并仅捕获{ {1}}。我该怎么办?
答案 0 :(得分:3)
如果您的文件名始终具有相同的格式,则可以使用DateTime::createFromFormat
将字符串转换为DateTime实例:
$date = DateTime::createFromFormat('*-Y-m-d-*.*', 'file-2018-02-19-second.json');
echo $date->format('Ymd');
您可以在php manual中找到不同的格式字符及其含义。
答案 1 :(得分:1)
$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;
}
希望可以帮到你!
答案 2 :(得分:1)
<?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
答案 3 :(得分:0)
这个问题似乎只是关于数据提取,而不是关于数据验证。
代码:(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