Warm tip: This article is reproduced from serverfault.com, please click

其他-正则表达式的URL路径可以只是一个正斜杠

(其他 - RegEx for a url path that can just be a forward slash)

发布于 2020-11-27 12:36:28

我正在尝试创建一个正则表达式来验证网址路径。我想出了这个:

^\/([a-zA-Z0-9\-]+)?$

这允许我使用have/或or/moo或更复杂的方法,/products-123但不允许我使用多个正斜杠,例如/blog/posts-123有人可以帮我弄这个吗?

理想情况下,它应该能够:

  1. 只是本国路线的斜线
  2. 正斜杠后跟字母数字(带破折号)
  3. 步骤2重复复制
  4. 它不应允许任何路径以正斜杠结尾

如果有人可以帮助我,那就太好了

Questioner
r3plica
Viewed
11
Peter Thoeny 2020-11-28 16:07:58

此正则表达式允许

  • 一个单斜线,或
  • 一个斜线,随后的字母数字字符和破折号,重复1次或多次:

let urls = [
  '/',
  '/aaa-bbb',
  '/aaa-bbb/ccc',
  '/aaa-bbb/ccc/ddd',
  '/aaa-bbb/ccc/ddd/eee',
  '',  // empty
  '//double-slash',
  '/end-with-slash/',
];
let regex = /^(\/|(\/[a-zA-Z0-9\-]+)+)$/;
urls.forEach((url) => {
  let result = regex.test(url);
  console.log('"' + url + '"  ==> ' + result);
});

结果:

"/"  ==> true
"/aaa-bbb"  ==> true
"/aaa-bbb/ccc"  ==> true
"/aaa-bbb/ccc/ddd"  ==> true
"/aaa-bbb/ccc/ddd/eee"  ==> true
""  ==> false
"//double-slash"  ==> false
"/end-with-slash/"  ==> false

从结果中可以看到,它可以防止出现空的URL路径,带有双斜杠的URL路径以及以斜杠结尾的URL路径。

正则表达式的说明:

  • ^(\/|(...)+)$ -期望一个斜杠或括号中的1+序列
  • \/[a-zA-Z0-9\-]+$ -括号中的序列为斜杠,后跟一个或多个字母数字和破折号