2016-01-11 15 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>

説明

タイトル* || [年*] || [コーデック]角括弧で囲まれた拡張
のフィールドがあり、オプション(たとえば、[フィールド1])
*:フィールドは

を保存したキーは、タイトルとして、すべてを一致させることです最後の有効なが見つかるまで(有効年数:1900-2016)、またはファイルの内線番号(ドット+ 3文字、c必要ならばハンギング)。

例外:フィルムは、(大文字と小文字を区別しない)blurayまたは[0-9]+p(例えば720p1080p)またはbrripで始まるすべてのセクションで有効な年が含まれていない場合にはタイトルセクションから取り除かれます。

正規表現ブレイクアウトRegex101 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

正規表現カスタマイズ

例外元のリストテンションは、必要な場合にテスト中に少しずつ新しい値で簡単に埋めることができます(ファイル拡張子として。 .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

関連する問題