PHP困难的preg_match

时间:2015-06-08 12:07:49

标签: php regex preg-match

我试图管理我用于XBMC的个人网络服务器上的一些文件,但所有文件(来自YIFY的电影)的名称都是

  

Jumanji.1995-720p.YIFY.mp4
      Silver.Linings.Playbook.2012.1080p.x264.YIFY.mp4
      American Hustle(2013)1080p BrRip x264 - YIFY.mp4

请注意,某些项目使用Example分隔,其他项目使用.或空格分隔。

所以我需要做的是将_文件转换为(标题,年份,质量)数组我只知道一些preg_match基础知识。 但这对我来说很难。

e.g

preg_match

这应该输出=

echo extract('American Hustle (2013) 1080p BrRip x264 - YIFY.mp4');

提前致谢

2 个答案:

答案 0 :(得分:5)

^(.*?)\W+(\d{4})(?=[\W ]+?(\d{3,4})p)

你可以尝试一下。参见演示。

https://regex101.com/r/nS2lT4/29

正则表达式启动并捕获从startnon word letter的任何内容,可以是一个或多个,并且前面有4 digits。之后,预测会确保在捕获{{ 1}} \d{4}可以是一个或多个,并且non word letters前面有4 digits。因为超前我们会捕获最后只有p的数字单词字符和4后面的字符。

答案 1 :(得分:1)

你有3种不同的格式,那么你需要3种不同的解析类型

试试这个:

$tests = array(
    // format 1
    "Jumanji.1995-720p.YIFY.mp4",
    "Silver.Linings.Playbook.2012-1080p.YIFY.mp4",
    "American.Hustle.2013-1080p.YIFY.mp4",
    // format 2
    "Jumanji.1995.720p.x264.YIFY.mp4",
    "Silver.Linings.Playbook.2012.1080p.x264.YIFY.mp4",
    "American.Hustle.2013.1080p.x264.YIFY.mp4",
    // format 3
    "Jumanji (1995) 720p BrRip x264 - YIFY.mp4",
    "Silver Linings Playbook (2012) 1080p BrRip x264 - YIFY.mp4",
    "American Hustle (2013) 1080p BrRip x264 - YIFY.mp4",
);


function extractInfos($s) {

    $infos = array();

    if (FALSE === strpos($s, ".YIFY.")) {
        // format 3

        $tab = explode(" ", $s);

        $yearIndex = count($tab) - 6;

        $infos["year"] = trim($tab[$yearIndex], "()");
        $infos["quality"] = $tab[$yearIndex + 1];

        array_splice($tab, $yearIndex);
        $infos["title"] = implode(" ", $tab);
    } else {
        // format 1 or 2

        $tab = explode(".", $s);

        $yearIndex = count($tab) - 3;

        if (FALSE === strpos($tab[$yearIndex], "-")) {
            // format 2

            $yearIndex -= 2;

            $infos["year"] = $tab[$yearIndex];
            $infos["quality"] = $tab[$yearIndex + 1];
        } else {
            // format 1
            list($infos["year"], $infos["quality"]) = explode("-", $tab[$yearIndex]);
        }

        array_splice($tab, $yearIndex);
        $infos["title"] = implode(" ", $tab);
    }


    return $infos;
}


echo "<table border=\"1\">";

foreach ($tests as $s) {
    $infos = extractInfos($s);

    ?>
        <tr>
            <td>
                <?php echo $infos["title"];?>
            </td>
            <td>
                <?php echo $infos["year"];?>
            </td>
            <td>
                <?php echo $infos["quality"];?>
            </td>
        </tr>
    <?php
}

echo "</table>";