javascript url-safe filename-safe string

ndm*_*web 47 javascript regex string filenames

寻找一个正则表达式/替换函数来取一个用户输入的字符串,例如"John Smith的酷页面",并返回一个文件名/ url安全字符串,如"john_smith_s_cool_page.html",或者某种程度的东西.

Sha*_*mer 115

好吧,这里有一个替换任何不是字母或数字的东西,并且使它全部小写,就像你的例子一样.

var s = "John Smith's Cool Page";
var filename = s.replace(/[^a-z0-9]/gi, '_').toLowerCase();
Run Code Online (Sandbox Code Playgroud)

说明:

正则表达式是/[^a-z0-9]/gi.好吧,实际上gi最后只是一组在使用表达式时使用的选项.

  • i 意味着"忽略大小写差异"
  • g 意思是"全球",这实际上意味着应该替换每一场比赛,而不仅仅是第一场比赛.

所以我们所看到的只是真的[^a-z0-9].让我们一步一步地阅读:

  • 所述[]定义"字符类别",其是单字符的列表.如果你写[one],那么它将匹配'o'或'n'或'e'.
  • 但是,^在字符列表的开头有一个.这意味着它应该只匹配不在列表中的字符.
  • 最后,字符列表是a-z0-9.将其读作"a到z和0到9".这是一种简短的写作方式abcdefghijklmnopqrstuvwxyz0123456789.

所以基本上,正则表达式所说的是:"查找不在'a'和'z'之间或'0'和'9'之间的每个字母".

  • 哦,那太近了!你只是缺少一点信息 - `-`是`[]`里面的保留字符.你需要逃脱它.因此,不需要为短划线(' - ')编写`-`,而是需要使用`\ -`.换句话说,正则表达式将是`/ [^ a-z0-9 _\ - ]/gi` (17认同)
  • 我将添加一个`.replace(/ _ {2,}/g,'_')`来消除结果中非常难看的连续`_`字符. (9认同)
  • 不适用于西里尔文或中文字母 (4认同)
  • 哦,@ShalomCraimer!所以,这么近!;-) `-` 是 `[]` 中的一个特殊字符,但只要它是括号中的最后一个字符,就没有必要对其进行转义。这也是 `eslint` 的偏好(`no-useless-escape`)。所以:`/[^a-z0-9_-]/gi`! (2认同)

spe*_*ane 16

我知道原始海报要求一个简单的正则表达式,但是,更多的参与清理文件名,包括文件名长度,保留文件名,当然还有保留字符.

查看node-sanitize-filename中的代码,以获得更强大的解决方案.

  • 它们会被截断以使其少于 255 个字符,这在某些文件系统中是一个限制。如果文件名已经太长,它只会截断扩展名 (2认同)

Ada*_*m D 5

为了更灵活和稳健地处理 unicode 字符等,您可以将slugify与一些正则表达式结合使用来删除不安全的 URL 字符

const urlSafeFilename = slugify(filename, { remove: /"<>#%\{\}\|\\\^~\[\]`;\?:@=&/g });
Run Code Online (Sandbox Code Playgroud)

这会在您的 url 中生成不错的 kebab-case filenemas,并允许在a-z0-9范围之外使用更多字符。