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 = '↳ ';
if (m = regex.exec(it)) {
title = titlelize(m[1]) || '-'; year = m[2] || '-';
out += '<font color="green"><b>Title</b>: "' + title +
'"  <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> ⇒ <input id="input" type="text" size="70" />
<br>↳ <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 Breakout 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
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.
Dies ist nicht trivial, weil ein Titel ein Jahr oder den Namen des Formats enthalten könnte. – timgeb
Das klingt, als ob es für 100% legale Zwecke verwendet wird. – JosephGarrone
Können Sie das Muster beschreiben, nach dem die Regex suchen soll? – 1252748