正在寻找一个正则表达式/替换函数来取一个用户输入的字符串,例如“John Smith的酷页面”,并返回一个文件名/ url安全字符串,如“john_smith_s_cool_page.html”,或类似的东西。
答案 0 :(得分:110)
嗯,这里有一个替换任何不是字母或数字的东西,并且使它全部小写,就像你的例子一样。
var s = "John Smith's Cool Page";
var filename = s.replace(/[^a-z0-9]/gi, '_').toLowerCase();
说明:
正则表达式为/[^a-z0-9]/gi
。好吧,实际上最后的gi
只是在使用表达式时使用的一组选项。
i
表示"忽略大小写差异" g
表示" global",这实际上意味着每个匹配都应该被替换,而不仅仅是第一个。所以我们所看到的只是[^a-z0-9]
。让我们一步一步地阅读:
[
和]
定义了一个"字符类",这是一个单字符列表。如果您要写[one]
,那么这将匹配' o'或者' n'或者' e'。^
。这意味着它应该只与列表中的不字符匹配。a-z0-9
。将其读作" a到z和0到9"。这是写abcdefghijklmnopqrstuvwxyz0123456789
的简短方法。基本上,正则表达式所说的是:"查找不在' a'之间的所有字母。和' z'或者在' 0'之间和' 9'"。
答案 1 :(得分:15)
我知道原始海报要求提供一个简单的正则表达式,但是,更多参与清理文件名,包括文件名长度,保留文件名,当然还有保留字符。
查看code in node-sanitize-filename以获得更强大的解决方案。
答案 2 :(得分:1)
我认为您的要求是用_替换空格和撇号,并在最后附加.html尝试找到这样的正则表达式。
参考
答案 3 :(得分:1)
要更灵活,更健壮地处理unicode字符等,可以将slugify与某些正则表达式结合使用以删除unsafe URL characters
const urlSafeFilename = slugify(filename, { remove: /"<>#%\{\}\|\\\^~\[\]`;\?:@=&/g });
这会在您的网址中产生不错的kebab-case文件名,并允许a-z0-9
范围之外的更多字符。