如何从文件名中获取电影或电视季节名称?

时间:2013-10-19 12:43:15

标签: php regex

我正在尝试创建存储在我的NAS上的电影和电视季节的电影数据库。但是文件的名称是这样的:

  • The.Walking.Dead.S04E01.HDTV.x264-ASAP
  • R.I.P.D.2013.HDRip.x264.AC3-FooKas
  • the.perks.of.being.a.wallflower.2012.1080p.bluray.x264-火花

我试图在许多网站上搜索这些字符串,例如TMDB.org,但他们找不到像这样的电影。是否有可能从这些字符串中获得TMDB友好的电影(或季节)名称?我试图用空格替换点,但它没有帮助。有什么想法吗?

我认为以下步骤可行,但我不熟悉正则表达式:

  • 用空格替换点
  • 年出现时剪切字符串
  • 在TMDB.org API中搜索

我担心没有年份或年份的文件是在质量之后(1080p,...)或者在上传者的昵称之后。

2 个答案:

答案 0 :(得分:3)

这些名称是自由格式的,但都具有相同的元素,如'name','year','codec','quality','resolution'等...所以你可以创建那些元素的列表并将它们过滤掉。

目标是获得最大可读的电影名称

我从未在php上写过一些东西,所以我首先在Perl上创建脚本,然后将其翻译成php,因为我可以......所以原谅我一些毛茸茸的PHP代码

$arr = array(
    'The.Walking.Dead.S04E01.HDTV.x264-ASAP',
    'R.I.P.D.2013.HDRip.x264.AC3-FooKas',
    'the.perks.of.being.a.wallflower.2012.1080p.bluray.x264-sparks'
);

foreach($arr as $value) {
        $words = preg_split('/[.]/', $value);
        $words = array_filter($words, create_function('$var','return !(preg_match("/(?:HDTV|bluray|\w{2,3}rip)|(?:x264)|(?:\d{4})|(?:\d{3,4}p)|(?:AC\d)/i", $var));'));
        echo join(' ', $words);
        echo "\n";
}

输出将是:

The Walking Dead S04E01
R I P D
the perks of being a wallflower

这是非常接近的...如果我的代码出现问题是Perl的代码,我确定它有效:

my @data = (
    'The.Walking.Dead.S04E01.HDTV.x264-ASAP',
    'R.I.P.D.2013.HDRip.x264.AC3-FooKas',
    'the.perks.of.being.a.wallflower.2012.1080p.bluray.x264-sparks'
);
for my $el ( @data ) {
    my @words = grep 
        {!/(?:HDTV|bluray|\w{2,3}rip)|(?:x264)|(?:\d{4})|(?:\d{3,4}p)|(?:AC\d)/i}
        split /[.]/, $el;
    print join ' ', @words, "\n";
}

答案 1 :(得分:0)

这至少应该让你开始。我确信有更好的方法可以做到这一点,我相信你会找到需要调整以适应所有场景的地方。

$subject = "the.perks.of.being.a.wallflower.2012.1080p.bluray.x264-sparks";
$pattern = '/[a-zA-Z0-9\.]+\.[0-9]{4}\./';
preg_match($pattern, $subject, $matches);
echo substr(str_replace('.', ' ', $matches[0]), 0, -6);