PCRE从字符串中间获取日期

时间:2017-12-28 02:17:57

标签: php regex pcre

字符串:

Destiny 2 12_9_2017 8_08_31 PM.mp4

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

  1. 游戏
  2. 日期
  3. 时间
  4. AM / PM
  5. 扩展
  6. 当游戏变化很大(标题中的各种长度,空格,冒号和连字符)时,我如何使用正则表达式来获取日期和时间(单独的,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填充)。

2 个答案:

答案 0 :(得分: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 :(得分: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/'