我正在使用第三方.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
};
};
这里的用例是完整的文件路径。例如,“driveletter:\ temp \ test \ test.zip” 这可以匹配具有多个“点”(例如filename.aspx.js)和逗号等文件,但我现在遇到的问题是你也可以在foldername中有一个“点”。我试过添加。到正则表达式的第一个括号:[^ \。],但也没有通过测试。
我怎样才能让它发挥作用?我意识到上面的RegEx可能还有其他问题(例如,我认为扩展可以有其他字符而不是\ w允许等等)并且不介意也指出它们。
理想情况下,控件会使用在文件名中无效的分隔符(例如\ /:*?“<> |),但我无法更改...
jsFiddle link - 注意我已注释掉警告以避免加载弹出窗口...
答案 0 :(得分:1)
只要逗号可以表示分隔符或文件名字符,就确实无法可靠地覆盖原始文件名。这里的正则表达式不能比普通的.split()
更多。
您尝试从文件名中的逗号恢复的任何操作都只能是猜测。例如,如果第一个路径的起点是驱动器号或UNC(/(\\|([A-Z]:)?)\\/
),则可以检查以下每个路径的开头,以查看其中任何一个路径是否以驱动器号模式开头,如果是这样,假设它是一个糟糕的分裂,并与前一个路径和一个逗号重新组合。
但是对于网络上的文件上传,你不能对你得到的路径名做任何假设。有些浏览器根本不会在文件上传字段值中放置完整路径,只有文件部分(这会阻止您进行上述检查);路径段可以包含任意顺序的多个点和逗号(根本不包括任何点),Mac和Unix机器完全具有不同的路径分隔符。
因此,虽然最好请求修复第三方代码,如果没有,那么也许您可以考虑抓取每个上传控件的onchange
事件并阻止在文件名中使用逗号进行任何上传...实际上你应该避免依赖上传文件名,并且当文件名格式不符合你的期望时,可以回归到合理的事情而不是突然失败。