code in here
运用path-to-regexp,我们能够在途径字符串中运用正则。如/:foo*/:bar?
、/icon-:foo(\\d+).png
等。
像express、vue很多框架都引用它做途径婚配,看一看,一劳永逸。
直接挪用组织函数运用,一个能够含某种婚配情势的途径字符串作为它的必选参数,它返回一个正则对象。
我们的要求途径与该正则婚配,婚配胜利就是接上头了。
const pathToRegexp = require('path-to-regexp')
var regexp_1 = pathToRegexp('/foo/:bar')// /^\/foo\/([^\/]+?)(?:\/)?$/i
regexp_1.exec('/foo/barrrr')//婚配胜利 =>RegExpExecArray [ '/foo/barrrr', 'barrrr', index: 0, input: '/foo/barrrr' ]
regexp_1.exec('/bazzzz')//婚配失利 => null
/foo/:bar
中的/
为分隔符,把多个婚配情势分离隔,这里就分红foo
和:bar
。像foo
这类不带:
前缀的,我们要求的途径须要和它完整婚配,而:bar
这类,叫定名参数,就像个函数形参,能够通报任何要求途径字串给它。
在定名参数上,我们能够运用参数修饰符作为其后缀,有?
、+
、*
var regexp_2 = pathToRegexp('/foo/:bar*')
regexp_2.exec('/foo/a/b/c')// => [ '/foo/a/b/c', 'a/b/c', index: 0, input: '/foo/a/b/c' ]
regexp_2.exec('/foo')// => [ '/foo', undefined, index: 0, input: '/foo' ]
*
示意我这个定名参数:bar
能够吸收随便个婚配情势,就好像参数数组长度[0,+∞)
var regexp_3 = pathToRegexp('/foo/:bar+')
regexp_3.exec('/foo/a/b/c')// => [ '/foo/a/b/c', 'a/b/c', index: 0, input: '/foo/a/b/c' ]
regexp_3.exec('/foo')//婚配失利 => null
+
示意定名参数能够吸收最少一个婚配情势,一个都没就婚配失利,[1,+∞)
var regexp_4 = pathToRegexp('/foo/:bar?')
regexp_4.exec('/foo/a')// => [ '/foo/a', 'a', index: 0, input: '/foo/a' ]
regexp_4.exec('/foo/a/b/c')// => null
regexp_4.exec('/foo')// => [ '/foo', undefined, index: 0, input: '/foo' ]
?
示意定名参数能够吸收0个或1个婚配情势,多个失利,[0,1]
我们还能够为定名参数加上自定义的正则婚配情势
var regexp_5 = pathToRegexp('/icon-:foo(\\d+).png')
regexp_5.exec('/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_5.exec('/icon-abc.png')// null
以上设置示意:foo
只能是数字。
更牛X的是,某些时刻不须要定名参数这个占位符,经由过程正则就可以就可以婚配。
var regexp_5 = pathToRegexp('/icon-(\\d+).png')
regexp_5.exec('/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_5.exec('/icon-abc.png')// null
以上就是这个lib包括的一切婚配情势了。
鸡肋部份
path-to-regexp还包括了没什么用的参数和要领。
组织函数上的可选参数keys
var regexp_6 = pathToRegexp('/:foo/icon-(\\d+).png',keys)
regexp_6.exec('/home/icon-123.png')// => [ '/icon-123.png', '123', index: 0, input: '/icon-123.png' ]
regexp_6.exec('/about/icon-abc.png')// null
console.log(keys)
/**
keys output =>
[ { name: 'foo',
prefix: '/',
delimiter: '/',
optional: false,
repeat: false,
partial: false,
pattern: '[^\\/]+?' },
{ name: 0,
prefix: '',
delimiter: '/',
optional: false,
repeat: false,
partial: false,
pattern: '\\d+' } ]
*/
keys
为一个数组,包括了一切参数的详细信息,看属性名就晓得这些信息详细是干吗的了。
注重: 未定名参数的keys.name
为0
要领pathToRegexp.parse(path)
,吸收一个途径字符串参数
var tokens = pathToRegexp.parse('/foo/:baz/icon-(\\d+).png')
console.log(tokens)
/**
tokens output =>
[ '/foo',
{ name: 'baz',
prefix: '/',
delimiter: '/',
optional: false,
repeat: false,
partial: false,
pattern: '[^\\/]+?' },
'/icon-',
{ name: 0,
prefix: '',
delimiter: '/',
optional: false,
repeat: false,
partial: false,
pattern: '\\d+' },
'.png' ]
*/
该要领返回一个tokens
数组,该数组与keys
相似,不过它还包括途径中那些非参数部份,如tokens[0]
的/foo
。
我们能够不传详细的途径字符串,而运用tokens
替代。
var regexp_7 = pathToRegexp.tokensToRegExp(tokens)
regexp_7.exec('/foo/bazzz/icon-123.png')//[ '/foo/bazzz/icon-123.png','bazzz','123',... ]
var toPathWithTokens = pathToRegexp.tokensToFunction(tokens)
toPathWithTokens({baz:'bazzz',0:'123'}) // => /foo/bazzz/icon-123.png
有两个要领: pathToRegexp.tokensToRegExp(tokens)
返回一个正则对象,效果与挪用组织函数一样pathToRegexp.tokensToFunction(tokens)
返回一个函数,该函数与下面的compile(path)
返回的函数功用一样
要领 pathToRegexp.compile(path)
,一样吸收一个途径字符串。
var toPath = pathToRegexp.compile('/foo/:baz/icon-(\\d+).png')
toPath({baz:'bazzz',0:'123'})//=> /foo/bazzz/icon-123.png
该要领返回一个函数,该函数吸收一个对象,以对象的情势传值给途径参数,返回要求途径。