Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PCRE从字符串中间获取日期_Php_Regex_Pcre - Fatal编程技术网

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更新以同时获取时间。注意,实际上很容易得到时间;我们可以抓取日期后的所有东西,而不是周期。