Php PCRE从字符串中间获取日期
字符串:Php PCRE从字符串中间获取日期,php,regex,pcre,Php,Regex,Pcre,字符串: Destiny 2 12_9_2017 8_08_31 PM.mp4 所有这些字符串将有5个部分 游戏 日期 时间 上午/下午 延伸 当游戏的长度、空格、冒号、连字符变化很大时,我该如何使用正则表达式来获取日期和时间(分别使用两个单独的函数) 例如,它必须处理所有这些字符串 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 Fo
Destiny 2 12_9_2017 8_08_31 PM.mp4
所有这些字符串将有5个部分
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)。我将定义以下函数:
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个数字的一般模式。我们需要确保捕捉到正确的一个,因此通过包含这两个,我们可以覆盖这个边缘案例
您可以尝试使用此模式
$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/'
这是一个非常简单的正则表达式。你有没有尝试过学习它?比如,如果你也想捕捉AM/PM信息,你可以这样修改:
(\d+\ud+\ud{4})\s+(\d+\ud+\ud+(?:AM | PM))
@MateuszMarchel OP似乎在询问日期,而不是时间,也不是AM/PM数量。但如果需要的话,我的答案可以很容易地扩展到这一点。问题是:“我将如何使用regex来获取日期和时间”@MateuszMarchel-answer更新以同时获取时间。注意,实际上很容易得到时间;我们可以抓取日期后的所有东西,而不是周期。