【问题标题】:PCRE To Get Date from middle of stringPCRE从字符串中间获取日期
【发布时间】:2017-12-28 02:17:57
【问题描述】:

字符串:

Destiny 2 12_9_2017 8_08_31 PM.mp4

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

  1. 游戏
  2. 日期
  3. 时间
  4. 上午/下午
  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 填充)。

【问题讨论】:

  • 这是一个非常简单的正则表达式。你有没有尝试过学习它?
  • 类似THIS

标签: php regex pcre


【解决方案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

【讨论】:

  • 如果你还想捕捉上午/下午的信息,你可以这样修改:(\d+_\d+_\d{4})\s+(\d+_\d+_\d+ (?:AM|PM))
  • @MateuszMarchel OP 似乎在询问日期,而不是时间,也不是 AM/PM 数量。但如果需要,我的回答可以很容易地扩展到这样做。
  • 问题是:“我如何通过正则表达式获取日期和时间”
  • @MateuszMarchel 答案已更新,以节省时间。请注意,实际上很容易获得时间。我们可以抓取日期之后的所有内容,而不是句号。
【解决方案2】:

你可以试试这个模式

$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/'

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多