path-to-regex
Turn a path string such as
/user/:id
or/user/:id(\d+)
into a regular expression
Installation
npm install path-to-regex --save
Usage
var pathToRegex = ; var parser = path_template options?);
- path_template A string or a regular expression.
- options
- case When
true
the regexp will be case sensitive. (default:true
) - separators The chars list for splited patch string. (default:
'/'
) - fromStart When
true
the regexp will match from the beginning of the string. (default:true
) - toEnd When
true
the regexp will match to the end of the string. (default:true
)
- case When
How it works?
It is important to understand how the key :key
is interpreted depending on the pattern :key(.*)
used and quantifiers :key*
. The following examples will help you understand the logic for obtaining key values.
*
will capture everything that is not a separator options.separators
the quantifier let parser = ':path*'; // parser.regexp: /^[\/]?((?:[\/]?[^\/]+)*)[\/]?$/ let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] } let parser = '/:path*'; // parser.regexp: /^[\/]?((?:[\/]?[^\/]+)*)[\/]?$/ let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] }let result = parser; // result: { path: [ 'user', 'id' ] }
(...)
, in contrast quantifier, allows you to directly determine the valid key pattern. Such pattern (.*)
will capture everything, including the splitter.
Pattern let parser = ':path(.*)'; // parser.regexp: /^[\/]?(.*?)[\/]?$/ let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' } let parser = '/:path(.*)'; // parser.regexp: /^[\/]?(.*?)[\/]?$/ let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' }let result = parser; // result: { path: 'user/id' }
Samples
The following examples clearly demonstrate the use of keys, their pattern quantifiers.
:keyname(\\d+)
Demonstration of processing a key identifier with a specific content let parser = '/foo/:bar(\\d+)'; // parser.regexp: /^[\/]?foo\/?(\d+?)[\/]?$/ let result = parser; // result: { bar: '123' }let result = parser; // result: undefinedlet result = parser; // result: undefinedlet result = parser; // result: undefined
:keyname1 ... :keyname2
Demonstration of processing a multiple key identifiers let parser = '/user/:foo/:bar'; // parser.regexp: /^[\/]?user\/?([^\/]+?)\/?([^\/]+?)[\/]?$/ let result = parser; // result: { foo: '123', bar: 'asd' }let result = parser; // result: { foo: 'asd', bar: '123' }
:keyname(\\d+) ... :keyname(\d+)
Demonstration of processing a key identifiers with a repeated names let parser = '/foo/:bar/:bar'; // parser.regexp: /^[\/]?foo\/?([^\/]+?)\/?([^\/]+?)[\/]?$/ let result = parser; // result: { bar: [ '123', 'asd' ] }let result = parser; // result: { bar: [ 'asd', '123' ] }
?
Demonstration of processing a key identifier with a quantifier let parser = '/foo/:bar?'; // parser.regexp: /^[\/]?foo\/?([^\/]+?)?[\/]?$/ let result = parser; // result: { bar: '123' }let result = parser; // result: { bar: undefined }let result = parser; // result: { bar: undefined }
Demonstration of processing a key identifier with all features
let parser = '/user/:id/bar/:key(\\d+):post?fak/:key(\d+)*:foo+/test/pictures-:multi(\w+?\.png)*/:key?'; // parser.r/]+?)?fak\/((?:[^\/]*\d+)*)((?:[^\/]*[^\/]+)+)\/test\/pictures-((?:[^\/]*\w+?\.png)*)\/?([^\/]+?)?[\/]?$/ let result = parser;/* result: { id: '123', key: [ '111', '222', '333' ], post: 'qwerty', foo: [ 'foo' ], multi: [ 'p01.png', 'p02.png', 'p03.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111', '222' ], post: 'qwerty', foo: [ 'foo' ], multi: [ 'p01.png', 'p02.png', 'p03.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111', '222' ], post: undefined, foo: [ 'foo' ], multi: [ 'p01.png', 'p02.png', 'p03.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111' ], post: undefined, foo: [ 'foo' ], multi: [ 'p01.png', 'p02.png', 'p03.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111' ], post: undefined, foo: [ 'foo' ], multi: [ 'p01.png', 'p02.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111' ], post: undefined, foo: [ 'foo' ], multi: [ 'p01.png' ] } */ let result = parser;/* result: { id: '123', key: [ '111' ], post: undefined, foo: [ 'foo' ], multi: [] } */
... documentation in processed
Tests
Participation in development
https://github.com/lastuniverse/path-to-regex/issues
License
MIT