使用正则表达式(pcre)PHP忽略字符

问题描述 投票:0回答:4

我试图从文件file-2018-02-19-second.json捕获日期。

我正在使用.*file-(..........).*.json正则表达式捕获文件中的日期。正则表达式捕获文件中的2018-02-19日期但我想忽略文件中的"-"并且只捕获20180219。我该怎么做?

php regex
4个回答
3
投票

如果您的文件名始终具有相同的格式,则可以使用DateTime::createFromFormat将字符串转换为DateTime实例:

$date = DateTime::createFromFormat('*-Y-m-d-*.*', 'file-2018-02-19-second.json');
echo $date->format('Ymd');

您可以在php manual中找到不同的格式字符及其含义。


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;
}

希望可以帮到你!

相关链接:https://www.regextester.com/96683


1
投票

Option 1 - Match & Replace

See code in use here

<?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';

Option 2 - Group & Concatenate

See code in use here

<?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';

Explanation of Patterns

.*file-\K\d{4}-\d{2}-\d{2}
  • .*任意次数匹配任何字符
  • file-按字面意思对比
  • \K重置比赛的起点。最终匹配中不再包含任何先前消费的字符。
  • \d{4}恰好匹配任何数字4次
  • -按字面意思对比
  • \d{2}恰好匹配任何数字2次
  • -按字面意思对比
  • \d{2}恰好匹配任何数字2次

第二种模式\D+简单地匹配任何非数字字符一次或多次以进行替换。

最后一个模式(来自选项2)实际上只是我描述的第一个模式的简化版本,但是将每个数字部分组成捕获组。

结果:20180219


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
© www.soinside.com 2019 - 2024. All rights reserved.