You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					242 lines
				
				7.9 KiB
			
		
		
			
		
	
	
					242 lines
				
				7.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								# Path-to-RegExp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Turn a path string such as `/user/:name` into a regular expression.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[![NPM version][npm-image]][npm-url]
							 | 
						||
| 
								 | 
							
								[![Build status][travis-image]][travis-url]
							 | 
						||
| 
								 | 
							
								[![Test coverage][coveralls-image]][coveralls-url]
							 | 
						||
| 
								 | 
							
								[![Dependency Status][david-image]][david-url]
							 | 
						||
| 
								 | 
							
								[![License][license-image]][license-url]
							 | 
						||
| 
								 | 
							
								[![Downloads][downloads-image]][downloads-url]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Installation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								npm install path-to-regexp --save
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var pathToRegexp = require('path-to-regexp')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// pathToRegexp(path, keys?, options?)
							 | 
						||
| 
								 | 
							
								// pathToRegexp.parse(path)
							 | 
						||
| 
								 | 
							
								// pathToRegexp.compile(path)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- **path** A string, array of strings, or a regular expression.
							 | 
						||
| 
								 | 
							
								- **keys** An array to be populated with keys found in the path.
							 | 
						||
| 
								 | 
							
								- **options**
							 | 
						||
| 
								 | 
							
								  - **sensitive** When `true` the regexp will be case sensitive. (default: `false`)
							 | 
						||
| 
								 | 
							
								  - **strict** When `true` the regexp allows an optional trailing delimiter to match. (default: `false`)
							 | 
						||
| 
								 | 
							
								  - **end** When `true` the regexp will match to the end of the string. (default: `true`)
							 | 
						||
| 
								 | 
							
								  - **start** When `true` the regexp will match from the beginning of the string. (default: `true`)
							 | 
						||
| 
								 | 
							
								  - Advanced options (use for non-pathname strings, e.g. host names):
							 | 
						||
| 
								 | 
							
								    - **delimiter** The default delimiter for segments. (default: `'/'`)
							 | 
						||
| 
								 | 
							
								    - **endsWith** Optional character, or list of characters, to treat as "end" characters.
							 | 
						||
| 
								 | 
							
								    - **delimiters** List of characters to consider delimiters when parsing. (default: `'./'`)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var keys = []
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/foo/:bar', keys)
							 | 
						||
| 
								 | 
							
								// re = /^\/foo\/([^\/]+?)\/?$/i
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'bar', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\\/]+?' }]
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Please note:** The `RegExp` returned by `path-to-regexp` is intended for ordered data (e.g. pathnames, hostnames). It does not handle arbitrary data (e.g. query strings, URL fragments, JSON, etc).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Parameters
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The path argument is used to define parameters and populate the list of keys.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Named Parameters
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Named parameters are defined by prefixing a colon to the parameter name (`:foo`). By default, the parameter will match until the following path segment.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/:foo/:bar')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', prefix: '/', ... }, { name: 'bar', prefix: '/', ... }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/test/route')
							 | 
						||
| 
								 | 
							
								//=> ['/test/route', 'test', 'route']
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Please note:** Parameter names must be made up of "word characters" (`[A-Za-z0-9_]`).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Parameter Modifiers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								##### Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parameters can be suffixed with a question mark (`?`) to make the parameter optional.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/:foo/:bar?')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', ... }, { name: 'bar', delimiter: '/', optional: true, repeat: false }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/test')
							 | 
						||
| 
								 | 
							
								//=> ['/test', 'test', undefined]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/test/route')
							 | 
						||
| 
								 | 
							
								//=> ['/test', 'test', 'route']
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Tip:** If the parameter is the _only_ value in the segment, the prefix is also optional.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								##### Zero or more
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parameters can be suffixed with an asterisk (`*`) to denote a zero or more parameter matches. The prefix is taken into account for each match.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/:foo*')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', delimiter: '/', optional: true, repeat: true }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/')
							 | 
						||
| 
								 | 
							
								//=> ['/', undefined]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/bar/baz')
							 | 
						||
| 
								 | 
							
								//=> ['/bar/baz', 'bar/baz']
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								##### One or more
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parameters can be suffixed with a plus sign (`+`) to denote a one or more parameter matches. The prefix is taken into account for each match.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/:foo+')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', delimiter: '/', optional: false, repeat: true }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/')
							 | 
						||
| 
								 | 
							
								//=> null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/bar/baz')
							 | 
						||
| 
								 | 
							
								//=> ['/bar/baz', 'bar/baz']
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Custom Matching Parameters
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								All parameters can be provided a custom regexp, which overrides the default match (`[^\/]+`). For example, you can match digits in the path:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/icon-:foo(\\d+).png')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', ... }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/icon-123.png')
							 | 
						||
| 
								 | 
							
								//=> ['/icon-123.png', '123']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/icon-abc.png')
							 | 
						||
| 
								 | 
							
								//=> null
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Please note:** Backslashes need to be escaped with another backslash in strings.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Unnamed Parameters
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It is possible to write an unnamed parameter that only consists of a matching group. It works the same as a named parameter, except it will be numerically indexed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var re = pathToRegexp('/:foo/(.*)')
							 | 
						||
| 
								 | 
							
								// keys = [{ name: 'foo', ... }, { name: 0, ... }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								re.exec('/test/route')
							 | 
						||
| 
								 | 
							
								//=> ['/test/route', 'test', 'route']
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Parse
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The parse function is exposed via `pathToRegexp.parse`. This will return an array of strings and keys.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var tokens = pathToRegexp.parse('/route/:foo/(.*)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log(tokens[0])
							 | 
						||
| 
								 | 
							
								//=> "/route"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log(tokens[1])
							 | 
						||
| 
								 | 
							
								//=> { name: 'foo', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\\/]+?' }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log(tokens[2])
							 | 
						||
| 
								 | 
							
								//=> { name: 0, prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '.*' }
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Note:** This method only works with strings.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Compile ("Reverse" Path-To-RegExp)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Path-To-RegExp exposes a compile function for transforming a string into a valid path.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var toPath = pathToRegexp.compile('/user/:id')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								toPath({ id: 123 }) //=> "/user/123"
							 | 
						||
| 
								 | 
							
								toPath({ id: 'café' }) //=> "/user/caf%C3%A9"
							 | 
						||
| 
								 | 
							
								toPath({ id: '/' }) //=> "/user/%2F"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								toPath({ id: ':/' }) //=> "/user/%3A%2F"
							 | 
						||
| 
								 | 
							
								toPath({ id: ':/' }, { encode: (value, token) => value }) //=> "/user/:/"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var toPathRepeated = pathToRegexp.compile('/:segment+')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								toPathRepeated({ segment: 'foo' }) //=> "/foo"
							 | 
						||
| 
								 | 
							
								toPathRepeated({ segment: ['a', 'b', 'c'] }) //=> "/a/b/c"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var toPathRegexp = pathToRegexp.compile('/user/:id(\\d+)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								toPathRegexp({ id: 123 }) //=> "/user/123"
							 | 
						||
| 
								 | 
							
								toPathRegexp({ id: '123' }) //=> "/user/123"
							 | 
						||
| 
								 | 
							
								toPathRegexp({ id: 'abc' }) //=> Throws `TypeError`.
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Note:** The generated function will throw on invalid input. It will do all necessary checks to ensure the generated path is valid. This method only works with strings.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Working with Tokens
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Path-To-RegExp exposes the two functions used internally that accept an array of tokens.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `pathToRegexp.tokensToRegExp(tokens, keys?, options?)` Transform an array of tokens into a matching regular expression.
							 | 
						||
| 
								 | 
							
								* `pathToRegexp.tokensToFunction(tokens)` Transform an array of tokens into a path generator function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Token Information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `name` The name of the token (`string` for named or `number` for index)
							 | 
						||
| 
								 | 
							
								* `prefix` The prefix character for the segment (`/` or `.`)
							 | 
						||
| 
								 | 
							
								* `delimiter` The delimiter for the segment (same as prefix or `/`)
							 | 
						||
| 
								 | 
							
								* `optional` Indicates the token is optional (`boolean`)
							 | 
						||
| 
								 | 
							
								* `repeat` Indicates the token is repeated (`boolean`)
							 | 
						||
| 
								 | 
							
								* `partial` Indicates this token is a partial path segment (`boolean`)
							 | 
						||
| 
								 | 
							
								* `pattern` The RegExp used to match this token (`string`)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Compatibility with Express <= 4.x
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Path-To-RegExp breaks compatibility with Express <= `4.x`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* RegExp special characters can only be used in a parameter
							 | 
						||
| 
								 | 
							
								  * Express.js 4.x used all `RegExp` special characters regardless of position - this considered a bug
							 | 
						||
| 
								 | 
							
								* Parameters have suffixes that augment meaning - `*`, `+` and `?`. E.g. `/:user*`
							 | 
						||
| 
								 | 
							
								* No wildcard asterisk (`*`) - use parameters instead (`(.*)`)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## TypeScript
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Includes a [`.d.ts`](index.d.ts) file for TypeScript users.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Live Demo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MIT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[npm-image]: https://img.shields.io/npm/v/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[npm-url]: https://npmjs.org/package/path-to-regexp
							 | 
						||
| 
								 | 
							
								[travis-image]: https://img.shields.io/travis/pillarjs/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[travis-url]: https://travis-ci.org/pillarjs/path-to-regexp
							 | 
						||
| 
								 | 
							
								[coveralls-image]: https://img.shields.io/coveralls/pillarjs/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[coveralls-url]: https://coveralls.io/r/pillarjs/path-to-regexp?branch=master
							 | 
						||
| 
								 | 
							
								[david-image]: http://img.shields.io/david/pillarjs/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[david-url]: https://david-dm.org/pillarjs/path-to-regexp
							 | 
						||
| 
								 | 
							
								[license-image]: http://img.shields.io/npm/l/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[license-url]: LICENSE.md
							 | 
						||
| 
								 | 
							
								[downloads-image]: http://img.shields.io/npm/dm/path-to-regexp.svg?style=flat
							 | 
						||
| 
								 | 
							
								[downloads-url]: https://npmjs.org/package/path-to-regexp
							 |