2016-01-11 8 views
5

Wie schreibe ich eine Regex, die Titel und, wenn vorhanden, Jahr von Dateinamen bekommt? Siehe Beispiele unten.Titel und Jahr aus dem Dateinamen mit Regex

Diese Lösung für PHP funktioniert, aber im mit Problem, das es in Javascript übersetzen 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

Dies ist nicht trivial, weil ein Titel ein Jahr oder den Namen des Formats enthalten könnte. – timgeb

+3

Das klingt, als ob es für 100% legale Zwecke verwendet wird. – JosephGarrone

+0

Können Sie das Muster beschreiben, nach dem die Regex suchen soll? – 1252748

Antwort

1

Die Lösung unten für alle Testfälle vorgesehen funktioniert, wie Sie (und etwas mehr als titlelize vorgesehen, siehe den Code unten) und soll anpassbar sein.

Lange Rede kurzer Sinn, versuchen die Schnipsel unten:

// 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>

Beschreibung

den Titel in etwa wie folgt strukturiert Unter der Annahme:

Titel * || [Jahr *] || [Codec] Erweiterung
Die in eckigen Klammern sind optional (zB [field1])
*: Feld gespeichert

Der Schlüssel ist alles wie Titel passen bis zum letzten gültigen Jahr gefunden (gültige Jahre: 1900-2016) oder bis die Datei Erweiterung (strukturiert als ein Punkt plus 3 Buchstaben, einfach zu c hange wenn nötig).

Ausnahmen: in dem Fall, in dem ein Film mit einem gültigen Jahr bei all dem Abschnitt, beginnend mit (Groß- und Kleinschreibung) bluray oder [0-9]+p (z.B. 720p, 1080p) oder brrip werden nicht enthält vom Abschnitt Titel gestrippt.

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 Customization

Die Liste der Ausnahmen und ex Spannungen können leicht nach und nach mit neuen Werten während Tests gefüllt werden, wenn/falls erforderlich (als Dateierweiterung, z.B. um .wmv und .flv hinzuzufügen, fügen Sie sie dem Abschnitt (mkv|avi|mpe?g|wmv|flv) der Regex hinzu oder um den Abschnitt generisch durch [.]\w{3,4}$ zu ersetzen.

+0

Und wenn der Titel eine Nummer enthält? – epascarello

+1

@epascarello: das erste Beispiel '' Se7en.avi'' enthält eine Nummer :) Nur die letzte Nummer des Strings wird als '' Jahr'' genommen und nur wenn zwischen '' 1900-2016'' und wenn vorangestellt ist durch etwas, so dass '2001 A Space Odyssey.mkv'' korrekt analysiert wird. Es gibt eine Live-Demo in der Antwort, die Sie selbst ausprobieren können! –

+0

https://en.wikipedia.org/wiki/Dracula_2000 ist ein Beispiel für einen Film mit einer Nummer, die ein Problem verursachen würde. Ich sage nur, dass es im Namensschema der Dateien Ausreißer gibt. (es sei denn mein Gehirn vermisst etwas) – epascarello

Verwandte Themen