字符串:
Destiny 2 12_9_2017 8_08_31 PM.mp4
所有这些字符串都有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填充)。
答案 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个数字的一般模式。我们需要确保我们捕获正确的一个,所以通过包括我们覆盖这个边缘情况。
答案 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/'