正则表达式:仅在斜杠之间匹配路由参数,但可选结束斜杠

Regex: Matching route parameters between slashes only but optional end slash

所以我这里有这个正则表达式:

\/?({[a-zA-Z_0-9]*})\/?

我希望它与这些匹配:

# Valid
/test3/{id}/{test}/{id}

# Valid
/admin/{slug}

# Not Valid
/test3{id}{test}

# Not Valid
/test/{id}/yyy/{dd}/dwdw/{wd}{d}

# Valid
/user/post/{id}

# Valid
/{tt}/{t}

# Valid
/test/{id}/yyy/{dd}////dwdw/{wd}/{d}

但我希望它不匹配参数之间没有斜线的参数,例如 {id}{test} 不应该匹配。

我该怎么做?

我在这里设置了一个正则表达式:https://regex101.com/r/awUDhM/5

您可以查找 /foo/{bar} 的重复模式,或者只是空的 /。代码片段:

var input = [
  '/test3/{id}/{test}/{id}',
  '/admin/{slug}',
  '/test3{id}{test}',
  '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
  '/user/post/{id}',
  '/{tt}/{t}',
  '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}'
];
input.forEach(function(str) {
  var result = /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/.test(str);
  console.log(str + ' ==> ' + result);
});

输出:

/test3/{id}/{test}/{id} ==> true
/admin/{slug} ==> true
/test3{id}{test} ==> false
/test/{id}/yyy/{dd}/dwdw/{wd}{d} ==> false
/user/post/{id} ==> true
/{tt}/{t} ==> true
/test/{id}/yyy/{dd}////dwdw/{wd}/{d} ==> true

/^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/ 正则表达式的解释:

  • ^ -- 字符串开头的锚点
  • (...)+ -- 里面的内容出现一次或多次
  • \/(...|...) -- 期望一个斜杠,后跟一个逻辑或组
  • [a-zA-Z0-9]* -- 第一个 OR 项:只有字母数字字符,包括 none
  • \{[a-z]+\} -- 第二个 OR 项:一个或多个包含在 {...}
  • 中的小写字符
  • $ -- 字符串末尾的锚点

只要检查一下字符串中是否没有 }{:

^(?:(?!}{).)+$

Demo & explanation

php代码:

$strs = [
  '/test3/{id}/{test}/{id}',
  '/admin/{slug}',
  '/test3{id}{test}',
  '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
  '/user/post/{id}',
  '/{tt}/{t}',
  '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}',
];
foreach($strs as $str) {
    if (preg_match('/^(?:(?!}{).)+$/', $str)) {
        echo "valid: $str\n";
    } else {
        echo "Not valid: $str\n";
    }
}

输出:

valid: /test3/{id}/{test}/{id}
valid: /admin/{slug}
Not valid: /test3{id}{test}
Not valid: /test/{id}/yyy/{dd}/dwdw/{wd}{d}
valid: /user/post/{id}
valid: /{tt}/{t}
valid: /test/{id}/yyy/{dd}////dwdw/{wd}/{d}