Skip to content

path-to-regexp

path-to-regexp 是一个用于将路径字符串转换为正则表达式的 JavaScript 库,它广泛应用于路由库(如 Express.jsReact-Router)中,以实现灵活的 URL 路由匹配。通过使用 path-to-regexp,开发者可以定义包含动态段、可选参数和自定义模式的路径规则,并将其编译成能够高效匹配实际 URL 的正则表达式。

主要功能

  1. 动态路径段

    • 支持定义带有命名参数的路径,这些参数可以在匹配时被捕获并提取出来。
  2. 可选参数

    • 允许指定某些部分是可选的,即它们可能出现在 URL 中也可能不出现。
  3. 通配符支持

    • 提供星号 (*) 或双星号 (**) 来表示任意数量的字符或路径层级。
  4. 自定义匹配模式

    • 可以为每个参数定义特定的匹配模式,确保只有符合模式的值才会被接受。
  5. 严格模式

    • 控制是否允许尾部斜杠的存在与否影响匹配结果。
  6. 解码捕获参数

    • 自动处理 URL 编码的参数,返回解码后的值。
  7. 键信息收集

    • 在编译过程中收集所有参数的信息,方便后续使用。

安装与使用

使用 npm 或 yarn 安装

bash
npm install path-to-regexp
# 或者
yarn add path-to-regexp

基本用法

javascript
const pathToRegexp = require("path-to-regexp");

// 创建一个正则表达式
let re = pathToRegexp("/user/:id(\\d+)", [key]);

// 测试 URL 是否匹配该路径模式
let m = re.exec("/user/123");
console.log(m); // 输出: [ '/user/123', '123' ]

// 获取捕获的参数名
console.log(key[0].name); // 输出: id

高级特性示例

1. 动态路径段

javascript
const keys = [];
let path = "/user/:id";
let regexp = pathToRegexp(path, keys);

let match = regexp.exec("/user/123");
console.log(match); // 输出: [ '/user/123', '123' ]
console.log(keys); // 输出: [ { name: 'id', prefix: '/', suffix: '', pattern: '[^\\/]+?', modifiers: '' } ]

2. 可选参数

javascript
let optionalPath = "/user/:id?";
let optionalRegexp = pathToRegexp(optionalPath, keys);

console.log(optionalRegexp.test("/user")); // true
console.log(optionalRegexp.test("/user/123")); // true

3. 自定义匹配模式

javascript
let customPatternPath = "/user/:id([0-9a-fA-F]{24})";
let customPatternRegexp = pathToRegexp(customPatternPath, keys);

console.log(customPatternRegexp.test("/user/5f3cfae5b7e8b8c1a5d7e8f9")); // true
console.log(customPatternRegexp.test("/user/not-an-object-id")); // false

4. 通配符

javascript
let wildcardPath = "/files/*";
let wildcardRegexp = pathToRegexp(wildcardPath, keys);

console.log(wildcardRegexp.test("/files/path/to/file.txt")); // true

5. 双星号 (匹配多层路径)

javascript
let doubleWildcardPath = "/deep/**";
let doubleWildcardRegexp = pathToRegexp(doubleWildcardPath, keys);

console.log(doubleWildcardRegexp.test("/deep/a/b/c")); // true

6. 严格模式

javascript
let strictPath = "/exact";
let strictRegexp = pathToRegexp(strictPath, [], { end: true });

console.log(strictRegexp.test("/exact")); // true
console.log(strictRegexp.test("/exact/")); // false (因为开启了严格模式)

解码捕获参数

默认情况下,path-to-regexp 会自动对 URL 编码的参数进行解码:

javascript
let encodedPath = "/user/:id";
let encodedRegexp = pathToRegexp(encodedPath, keys);

let result = encodedRegexp.exec("/user/j%20doe");
console.log(decodeURIComponent(result[1])); // 输出: j doe

总结

path-to-regexp 是一个强大且灵活的工具,特别适合需要处理复杂 URL 路径的应用场景。它不仅能够轻松地解析和生成 URL,还提供了丰富的配置选项来满足各种需求。无论是构建 RESTful API 还是实现前端路由逻辑,path-to-regexp 都能显著简化开发过程,提高代码的可读性和维护性。随着 Web 开发的不断进步,这个库将继续在路由管理和 URL 处理方面发挥重要作用。

Released under the MIT License.