0

我正在尝试为存储在我的 NAS 上的电影和电视季创建电影数据库。但是文件的名称如下所示:

  • The.Walking.Dead.S04E01.HDTV.x264-ASAP
  • RIPD2013.HDRip.x264.AC3-FooKas
  • the.perks.of.being.a.wallflower.2012.1080p.bluray.x264-sparks

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

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

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

恐怕有些文件没有年份或年份在质量(1080p,...)之后或上传者昵称之后。

4

2 回答 2

3

这些名称是自由格式,但都具有相同的元素,如“名称”、“年份”、“编解码器”、“质量”、“分辨率”等......因此您可以创建元素列表并过滤它们出去。

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

我从来没有在 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";
}
于 2013-10-19T14:37:21.097 回答
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);
于 2013-10-19T12:47:12.983 回答