Javascript RegEx用于以逗号分隔的文件路径列表

时间:2013-12-27 21:33:31

标签: javascript regex

我正在使用第三方.NET上传控件,它提供客户端函数,以字符串形式返回文件列表;但是,字符串是逗号分隔的。由于逗号在文件名中有效,因此可能会出现问题(边缘情况,我想你会称之为)。

所以我试图使用RegEx来解析每个文件名。之前我一直在做

var files = strFromControlCall.split(",").map(function (str) { return str.replace(/^.*[\\\/]/, ''); });

但如上所述,逗号上的拆分会导致实际文件名被进一步拆分。

我目前正在进行的RegEx如下:

var getFilesRegex = function(path) {
   var m = path.match(/[^\\]*\.([\.\w]+)/g);
   return {
      files: m
   };
};

注意使用术语“点”表示a。因为在我看来,在代码块之外很难看到

这里的用例是完整的文件路径。例如,“driveletter:\ temp \ test \ test.zip” 这可以匹配具有多个“点”(例如filename.aspx.js)和逗号等文件,但我现在遇到的问题是你也可以在foldername中有一个“点”。我试过添加。到正则表达式的第一个括号:[^ \。],但也没有通过测试。

我怎样才能让它发挥作用?我意识到上面的RegEx可能还有其他问题(例如,我认为扩展可以有其他字符而不是\ w允许等等)并且不介意也指出它们。

理想情况下,控件会使用在文件名中无效的分隔符(例如\ /:*?“<> |),但我无法更改...

jsFiddle link - 注意我已注释掉警告以避免加载弹出窗口...

1 个答案:

答案 0 :(得分:1)

只要逗号可以表示分隔符或文件名字符,就确实无法可靠地覆盖原始文件名。这里的正则表达式不能比普通的.split()更多。

您尝试从文件名中的逗号恢复的任何操作都只能是猜测。例如,如果第一个路径的起点是驱动器号或UNC(/(\\|([A-Z]:)?)\\/),则可以检查以下每个路径的开头,以查看其中任何一个路径是否以驱动器号模式开头,如果是这样,假设它是一个糟糕的分裂,并与前一个路径和一个逗号重新组合。

但是对于网络上的文件上传,你不能对你得到的路径名做任何假设。有些浏览器根本不会在文件上传字段值中放置完整路径,只有文件部分(这会阻止您进行上述检查);路径段可以包含任意顺序的多个点和逗号(根本不包括任何点),Mac和Unix机器完全具有不同的路径分隔符。

因此,虽然最好请求修复第三方代码,如果没有,那么也许您可以考虑抓取每个上传控件的onchange事件并阻止在文件名中使用逗号进行任何上传...实际上你应该避免依赖上传文件名,并且当文件名格式不符合你的期望时,可以回归到合理的事情而不是突然失败。