2016-01-11 2 views
5

Как написать регулярное выражение, которое получает заголовок и, если доступно, год от имени файла? См. Примеры ниже.Получить название и год из имени файла с помощью regex

Это решение работает для PHP, но им возникли проблемы перевода его в JavaScript Seprate movie name and year from moviefile name

The.Great.Gatsby.2013.BluRay.1080p.DTS.x264-CHD.mkv 
The Forbidden Girl 2013 BRRIP Xvid AC3-BHRG.avi 
Pain.&.Gain.2013.720p.BluRay.DD5.1.x264-HiDt.mkv 
Se7en.avi 
Se7en.(1995).avi 
How to train your dragon 2.mkv 
10,000BC (2010).1080p.avi 
+2

Это не тривиально, потому что заголовок может содержать год или название формата. – timgeb

+3

Похоже, что он используется для 100% юридических целей. – JosephGarrone

+0

Можете ли вы описать шаблон, который должен искать регулярное выражение? – 1252748

ответ

1

Решение, предлагаемое ниже работает для всех тестовых случаев вы обеспечили (и некоторыми дополнительными как titlelize см ниже код) и предназначен для настройки.

Короче говоря, попробуйте фрагмент кода ниже:

// Live Test 
 
var input = document.getElementById('input'); 
 
var output = document.getElementById('output'); 
 
input.oninput = function() { output.textContent = extractData(input.value); } 
 

 
// Samples 
 
var tests = ['The.Great.Gatsby.2013.BluRay.1080p.DTS.x264-CHD.mkv', 'The Forbidden Girl 2013 BRRIP Xvid AC3-BHRG.avi', 'Pain.&.Gain.2013.720p.BluRay.DD5.1.x264-HiDt.mkv', 'Se7en.(1995).avi', 'How to train your dragon 2.mkv', '10,000BC (2010).1080p.avi', 'The.Great.Gatsby.BluRay.1080p.DTS.x264-CHD.mkv', 'Se7en.avi', '2001 A Space Odyssey.BluRay.1080p.DTS.x264-CHD.mkv','Sand.Castle.2017.FRENCH.1080.WEBRip.AAC2.0-NEWCiNE-WwW.Zone-Telechargement.Ws.mkv']; 
 

 
while (t = tests.pop()) { 
 
    document.getElementById('list').innerHTML += '<b>INPUT</b>: "' + t + '"<br>'; 
 
    document.getElementById('list').innerHTML += extractData(t,true) + '<hr>'; 
 
} 
 

 
function titlelize(title) { 
 
    return title.replace(/(^|[. ]+)(\S)/g, function(all, pre, c) { return ((pre) ? ' ' : '') + c.toUpperCase(); }); 
 
}; 
 

 
function extractData(it, html) { 
 
    var regex = /^(.+?)[.(\t]*(?:(19\d{2}|20(?:0\d|1[0-9])).*|(?:(?=bluray|\d+p|brrip|webrip)..*)?[.](mkv|avi|mpe?g|mp4)$)/i; 
 

 
    var out = '&#8627;&nbsp;'; 
 
    
 
    if (m = regex.exec(it)) { 
 
     title = titlelize(m[1]) || '-'; year = m[2] || '-'; 
 
     out += '<font color="green"><b>Title</b>: "' + title + 
 
      '"&emsp; <b>Year</b>: "' + year + '"</font>'; 
 
    } else { 
 
     out += '<font color="red">No match</font>'; 
 
    } 
 
    //the replace is an hack to remove html in live input text 
 
    return (html) ? out : out.replace(/<[^>]+>|&[^;]+;/g,''); 
 
}
<mark><b>Paste and Try!</b></mark> &rArr; <input id="input" type="text" size="70" /> 
 
<br>&#8627;&emsp;<span id="output" style="line-height:40px;">No Match</span> 
 
<hr> 
 

 
<div id="list"></div>

Описание

Предполагая название структурировано примерно как это:

Заглавие * || [Год *] || [Codec] расширения
Поля, заключенные в квадратные скобки, являются необязательными (например [field1])
*: поле спас

Ключ должен соответствовать все как титул до последнего действительного год найдено (год выпуска: 1900-2016) или до файла расширение (структурировано как точка плюс 3 буквы, прост в использовании если необходимо).

Исключение: в случае, когда пленка не содержит действительный год на всех секциях, начиная с (чувствительно к регистру) bluray или [0-9]+p (например 720p, 1080p) или brrip удаляется из заголовка секции.

Regex BreakoutRegex101 Demo

/^ 
    (.+?)       # Save title into group $1 
    [.(\t]*      # Remove some separators 
    (?:        # Non capturing group 
    (19\d{2}|20(?:0\d|1[0-6])).* # Save years (1900-2016) in $2 
    |        # OR 
    (?:(?=bluray|\d+p|brrip)..*)? # Match string starting with bluray,brrip,720p... 
    [.](mkv|avi|mpe?g)$)   # Match extension (.mkv,.avi.,mpeg) add your own 
/i        # make the regex case insensitive 

Regular expression visualization

Regex Настройка

Список исключений и экс напряженность может быть легко заполнена новыми значениями во время тестов при необходимости/в случае необходимости (в качестве расширения файла, например. для добавления .wmv и .flv добавьте их в раздел (mkv|avi|mpe?g|wmv|flv) регулярного выражения) или для того, чтобы сделать общий раздел, замените его на [.]\w{3,4}$.

+0

И когда заголовок содержит номер? – epascarello

+1

@epascarello: первый пример '' Se7en.avi'' содержит число :) Только последний номер строки берется как '' year'', и только если между '' 1900-2016'' и если раньше что-то, поэтому '' 2001 A Space Odyssey.mkv'' разбирается правильно. В ответе есть живая демонстрация, вы можете попробовать сами! –

+0

https://en.wikipedia.org/wiki/Dracula_2000 - это пример фильма с номером, который может вызвать проблему. Просто говорю, что в схеме именования файлов есть некоторые выбросы. (если мой мозг чего-то не хватает) – epascarello

Смежные вопросы