寻找一个正则表达式/替换函数,将用户输入的字符串(例如“John Smith's Cool Page"),转换为文件名/ URL 安全字符串,例如 "john_smith_s_cool_page.html"。
寻找一个正则表达式/替换函数,将用户输入的字符串(例如“John Smith's Cool Page"),转换为文件名/ URL 安全字符串,例如 "john_smith_s_cool_page.html"。
这是一个将除字母和数字以外的所有内容替换掉,并把它们全部转为小写的函数,就像你的示例一样。
var s = "John Smith's Cool Page";
var filename = s.replace(/[^a-z0-9]/gi, '_').toLowerCase();
解释:
这个正则表达式是/[^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'之间的字母”。
var filename = s.replace(/[^a-z0-9_-]/gi, '_').toLowerCase()
- ndmweb-
是 []
内部的保留字符。你需要对其进行转义。因此,你需要使用 \ -
而不是 -
来表示短划线('-')。换句话说,正则表达式应该是 / [^a-z0-9_ \ -] / gi
。 - Shalom Craimer.replace(/_{2,}/g, '_')
来消除结果中连续出现的下划线字符,它们很丑。 - fguillen/[^a-z0-9_-]/gi
! - Arel我知道原作者要求一个简单的正则表达式,但是在清理文件名时还涉及到文件名长度、保留文件名以及保留字符。
请查看 node-sanitize-filename 中的代码,以获得更强大的解决方案。
function slugify(title) {
return title
.trim()
.replace(/ +/g, '-')
.toLowerCase()
.replace(/[^a-z0-9-]/g, '')
}
slug.value = slugify(text.value);
text.oninput = () => { slug.value = slugify(text.value); };
<input id="text" value="Foo: the old @Foobîdoo!! " style="font-size:1.2em">
<input id="slug" readonly style="font-size:1.2em">
我认为你的要求是将空格和撇号`s`替换为下划线并在末尾附加`.html`,请尝试查找此类正则表达式。
参考
" aAbc1290!@#$%^&*()-=_+;:[]{}'\"|,./<>? ".replace(/[\\\/:\*\?"<>\|]/g, "").trim() + ".html"
的东西。 - loxaxs