3

FileReference 的使用对有效字符有限制。
Error: Error #2087: The FileReference.download() file name contains prohibited characters.
这很好,因为我猜这个限制无论如何都来自底层文件系统

是否有一种通用的方法来修剪/替换所有被禁止的字符?

为了清楚起见,我追求的是:
var dirty:String = "Eat this !@##$%%^&&*()\/";.txt
var clean:String = dirty.replaceAllProhibitedCharacters();

我不是在寻找特定于操作系统的正则表达式,而是一个跨平台的解决方案。

4

2 回答 2

7

不允许的字符列表不会根据底层操作系统而改变,它是一个固定列表。FileReference.download()来自不允许字符列表的文档是:

/\:*?"<>|%

编辑:看起来@也不允许。

如果要从任意字符串中删除这些字符,可以执行以下操作:

var validFileName:String = invalidFileName.replace(/[\/\\:*?"<>|%@]/g, "");

如果您想用其他东西替换它们,则将第二个参数更改为replace().

编辑:添加@角色;逃脱了/角色。

于 2012-01-19T14:52:00.980 回答
3

以前的答案对我不起作用。这是有效的(使用 Flex 4.5):

public class FileNameSanitizer
{
public static function sanitize( fileName:String ):String
{
    var p:RegExp = /[:\/\\\*\?"<>\|%]/g;
    return fileName.replace( p, "" );
}
}

以及证明它的测试用例:

import flexunit.framework.TestCase;

public class FileNameSanitizerTest extends TestCase
{
    public function FileNameSanitizerTest()
    {
    }

    public function testSanitize():void
    {
        assertEquals( "bla", FileNameSanitizer.sanitize( "bla" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla/foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla\\foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla:foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla*foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla?foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla\"foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla<foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla>foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla|foo" ) );
        assertEquals( "blafoo", FileNameSanitizer.sanitize( "bla%foo" ) );

        assertEquals( "", FileNameSanitizer.sanitize( "/\\:*?\"<>|%" ) );
    }

}
于 2013-11-22T14:57:46.010 回答