javascript - 使用正则表达式从文件名中获取标题和年份

标签 javascript 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

最佳答案

下面提供的解决方案适用于您提供的所有测试用例(以及一些额外的标题,请参阅下面的代码)并且可以自定义。

长话短说,试试下面的片段:

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

描述

假设标题的结构大致如下:

Title* || [ Year* ] || [ Codec ] Extension
The fields enclosed in square brackets are optional (e.g [field1])
* : field saved

关键是将所有内容匹配为 title 直到找到最后一个有效的 year(有效年份:1900-2016)或直到文件 extension(结构为一个点加 3 个字母,如果需要可以轻松更改)。

异常(exception):如果电影的所有部分都不包含有效年份(不区分大小写)bluray[0-9 ]+p(例如 720p1080p)或 brriptitle 部分中删除。

正则表达式突破 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}$

关于javascript - 使用正则表达式从文件名中获取标题和年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34712335/

相关文章:

iphone - 在 UIWebView 中打开的 HTML 页面中自动填充用户名和密码

javascript - 使用 Lodash,如何将这些数据转换为所需的格式?

javascript - iframe 中的按钮使 div 显示在父级中

javascript - 获取在 JavaScript 中单击的类的索引。没有 jQuery

javascript - 用于删除所有出现的模式的正则表达式

javascript - 如何获取相同字符串之间的字符串javascript

javascript - 你能帮我用几行来简化一段 JavaScript 代码吗?

javascript - Google Chrome扩展程序Http请求

c# - 查找字符是否单独存在于字符串 C# 中

Java Regex - 从字符串中提取主题标签