我已经编写了一个PHP控制器,但我正在重写我的代码,所以我可以使用类似Backbone路由器的JSON路由将URI模式映射到PHP Class ::方法组合,或直接转换为HTML文档然后传递给客户端,像这样:
{
"/home" : "index.html",
"/podcasts": "podcasts.html",
"/podcasts/:param1/:param2": "SomeClass::someMethod"
}
Run Code Online (Sandbox Code Playgroud)
Backbone动态创建正则表达式以匹配URL的路由.我查看了主干代码,并提取了以下代码(它有点修改):
function _routeToRegExp (route) {
var optionalParam = /\((.*?)\)/g;
var namedParam = /(\(\?)?:\w+/g;
var splatParam = /\*\w+/g;
var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;
route = route.replace(escapeRegExp, '\\$&')
.replace(optionalParam, '(?:$1)?')
.replace(namedParam, function(match, optional){
return optional ? match : '([^\/]+)';
})
.replace(splatParam, '(.*?)');
return new RegExp('^' + route + '$');
}
Run Code Online (Sandbox Code Playgroud)
当我通过/podcasts/:param1/:param2上面的代码之类的路线时,我得到了/^\/podcasts\/([^\/]+)\/([^\/]+)$/.我试图编写一个PHP函数来获得完全相同的正则表达式.我试过了:
$route = '/podcasts/:param1/:param2';
$a = preg_replace('/[\-{}\[\]+?.,\\\^$|#\s]/', '\\$&', $route); // escapeRegExp
$b = preg_replace('/\((.*?)\)/', '(?:$1)?', $a); // …Run Code Online (Sandbox Code Playgroud)