PCRE从字符串中间获取日期

问题描述 投票:-1回答:2

字符串:

Destiny 2 12_9_2017 8_08_31 PM.mp4

所有这些字符串将有5个部分。

  1. 游戏
  2. 日期
  3. 时间
  4. AM /传票
  5. 延期

当游戏变化很大时(标题中的各种长度,空格,冒号和连字符),我将如何正则表达式获取日期和时间(单独地,2个单独的函数)。

例如,它必须与所有这些字符串一起使用。

Destiny 2 12_9_2017 8_08_31 PM.mp4
Assassin's Creed: Origins 12_9_2017 8_08_31 PM.mp4
Ori and the Blind Forest - Definitive Edition 12_9_2017 8_08_31 PM.mp4

无论游戏如何,都可以从该字符串中获取日期(不填充0)。

php regex pcre
2个回答
1
投票

我将定义以下功能:

function getGameDate($input) {
    preg_match('/(\d+_\d+_\d{4})\s+\d+_\d+_\d+/', $input, $re);
    return $re[1];
}

function getGameTime($input) {
    preg_match('/\d+_\d+_\d{4}\s+([^.]*)/', $input, $re);
    return $re[1];
}

print(getGameDate("Destiny 2 12_9_2017 8_08_31 PM.mp4") . "\n");
print(getGameTime("Destiny 2 12_9_2017 8_08_31 PM.mp4") . "\n");
print(getGameDate("Assassin's Creed: Origins 12_9_2017 8_08_31 PM.mp4") . "\n");
print(getGameTime("Assassin's Creed: Origins 12_9_2017 8_08_31 PM.mp4") . "\n");
print(getGameDate("Ori and the Blind Forest - Definitive Edition 12_9_2017 8_08_31 PM.mp4"));
print(getGameTime("Ori and the Blind Forest - Definitive Edition 12_9_2017 8_08_31 PM.mp4"));

没有什么神奇的事情发生在这里,除了你会发现我匹配日期和时间,然后只捕获前者。这是故意的,因为日期和时间都有由下划线分隔的3个数字的一​​般模式。我们需要确保我们捕获正确的一个,所以通过包括我们覆盖这个边缘情况。

Demo


1
投票

你可以尝试这种模式

$str = 'Destiny 2 12_9_2017 8_08_31 PM.mp4';
preg_match('/\d+\S+ \d+\S+ [A|P]M/', $str, $date_time);
echo $date_time[0];

// Or with this '/((\d+\S+){3}\s){2}[A|P]M/'
© www.soinside.com 2019 - 2024. All rights reserved.