Javascript 需要用于可接受文件名的正则表达式

Javascript 需要用于可接受文件名的正则表达式,javascript,regex,Javascript,Regex,我正在使用Fancy Upload 3和onSelect来选择一个文件,我需要运行一个检查以确保用户的文件名中没有任何错误字符。我目前正在让人们上传带有象形文字之类名字的文件 我需要检查文件名是否只包含: [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF] [\x80-\xA5] ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω var filenameReg = /^([A-Za-z0-9\-_. ]|[\x0

我正在使用Fancy Upload 3和onSelect来选择一个文件,我需要运行一个检查以确保用户的文件名中没有任何错误字符。我目前正在让人们上传带有象形文字之类名字的文件

我需要检查文件名是否只包含:

[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
[\x80-\xA5]
¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
  • A-Z
  • a-z
  • 0-9
  • _(下划线)
  • -(减)
  • 空间
  • (单字节和双字节)
  • 显然,你可以看到困难的地方。非英语单字节和双字节字符

    我看到了:

    [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
    
    [\x80-\xA5]
    
    ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
    
    ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
    
    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    还有这个:

    [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
    
    [\x80-\xA5]
    
    ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
    
    ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
    
    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    但这两份报告都没有完全涵盖目前的情况

    应该起作用的例子:

    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
  • 法斯特拉链
  • abc.zip
  • ABC.zip
  • Über.zip
  • 不适用的示例:

  • ∑∑ø∆.拉链
  • “哇!。拉链
  • •§¨¨拉链
  • 以下是接近,但我不是正则表达式专家,甚至不接近

    var filenameReg = /^[A-Za-z0-9-_]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF]+$/;
    
    提前谢谢


    Zafer的解决方案基本上是可行的,但它并没有捕获所有其他符号,见下文

    未捕获:

    [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
    
    [\x80-\xA5]
    
    ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
    
    ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
    
    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    捕获:

    [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
    
    [\x80-\xA5]
    
    ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
    
    ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
    
    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    Regex:

    [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
    
    [\x80-\xA5]
    
    ¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç
    
    ™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω
    
    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    

    以下方面应起作用:

    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    我将\放在-旁边,并将两个表达式分组,否则+号不会影响第一个表达式


    编辑1:我也放了。在表达式中

    以下方法应该有效:

    var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;
    
    我将\放在-旁边,并将两个表达式分组,否则+号不会影响第一个表达式

    编辑1:我也放了。在表达式中

    两个字符之间的(即
    [abc]|[def]
    )可以简化为一个字符类(
    [abcdef]
    )——第一个可以读作“(a或b或c)或(d或e或f)”;第二个字母是“(a或b或c或d或e或f)”。可能会使正则表达式出错的是第一个类中未替换的破折号——如果需要文字破折号,它应该是类中的最后一个字符

    因此,我们将修改您的表达式以使其正常工作:

    var filenameReg = /^[A-Za-z0-9_\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF-]+$/;
    
    现在的问题是您没有考虑文件扩展名,但这是一个简单的修改(假设您总是得到.zip文件):

    如果扩展名不同,用另一个模式替换
    zip

    两个模式(即
    [abc]|[def]
    )可以简化为单个字符类(
    [abcdef]
    )——第一个可以读作“(a或b或c)或(d或e或f)”;第二个字母是“(a或b或c或d或e或f)”。可能会使正则表达式出错的是第一个类中未替换的破折号——如果需要文字破折号,它应该是类中的最后一个字符

    因此,我们将修改您的表达式以使其正常工作:

    var filenameReg = /^[A-Za-z0-9_\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF-]+$/;
    
    现在的问题是您没有考虑文件扩展名,但这是一个简单的修改(假设您总是得到.zip文件):


    如果扩展名不同,请用另一个模式替换
    zip

    对于不同的平台,我们有不同的规则。但我想你指的是windows中的长文件名。为此,您可以使用以下正则表达式:

    var longFilenames=@“^[^\./:*\?\”“\\\\\\\”]{1}[^\/:*\?\”“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    注意:您需要说哪些字符是不允许的,而不是说哪些字符是允许的

    但请记住,这不是100%完整的正则表达式。如果你真的想让它完整,你也必须为保留名称添加例外

    您可以在此处找到有关文件名规则的更多信息:


    对于不同的平台,我们有不同的规则。但我想你指的是windows中的长文件名。为此,您可以使用以下正则表达式:

    var longFilenames=@“^[^\./:*\?\”“\\\\\\\”]{1}[^\/:*\?\”“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    注意:您需要说哪些字符是不允许的,而不是说哪些字符是允许的

    但请记住,这不是100%完整的正则表达式。如果你真的想让它完整,你也必须为保留名称添加例外

    您可以在此处找到有关文件名规则的更多信息:


    看起来是字符范围导致了问题,因为它们之间包含一些不允许的字符。由于您已经有了允许的字符列表,最好直接使用该列表:

    var filenameReg = /^[A-Za-z0-9_\-\ ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü]+$/;
    

    看起来是字符范围导致了问题,因为它们之间包含一些不允许的字符。由于您已经有了允许的字符列表,最好直接使用该列表:

    var filenameReg = /^[A-Za-z0-9_\-\ ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü]+$/;
    

    问题是它不接受双字节字符。比如键入Alt+e,然后键入e以获取é(')+e)。我想我知道为什么我的测试不起作用了。我想这是因为我的javascript不在一个单独的文件中,而编码是错误的,因为html文档。让我检查一下,因为你的例子确实有效。是的,编码可能是个问题。将文件编码改为UTF8可能会有所帮助。嗯,编码是utf-8。检查其他一些东西,以防对任何人都有帮助。它决定了价值的来源。出于某种原因,从输入字段中提取值会产生稍有不同的结果,但是当应用于上载脚本并计算输入的文件名时,它工作得非常好。问题是它不接受双字节字符。比如键入Alt+e,然后键入e以获取é(')+e)。我想我知道为什么我的测试不起作用了。我想这是因为我的javascript不在一个单独的文件中,而编码是错误的,因为html文档。让我检查一下,因为你的例子确实有效。是的,编码可能是个问题。将文件编码改为UTF8可能会有所帮助。嗯,编码是utf-8。检查其他一些东西,以防对任何人都有帮助。它决定了价值的来源。出于某种原因,从i