我已经编写了一个 PHP 控制器,但是我正在重写我的代码,这样我就可以拥有类似于 Backbone Router 的 JSON 路由,将 URI 模式映射到 PHP Class::method 组合,或者直接映射到 HTML 文档,然后将其传递给客户端,像这样:
{
"/home" : "index.html",
"/podcasts": "podcasts.html",
"/podcasts/:param1/:param2": "SomeClass::someMethod"
}
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 + '$');
}
当我将 , 之类的路线传递给/podcasts/:param1/:param2
上面的代码时,我得到/^\/podcasts\/([^\/]+)\/([^\/]+)$/
. 我试图编写一个 PHP 函数来获得完全相同的正则表达式。我试过了:
$route = '/podcasts/:param1/:param2';
$a = preg_replace('/[\-{}\[\]+?.,\\\^$|#\s]/', '\\$&', $route); // escapeRegExp
$b = preg_replace('/\((.*?)\)/', '(?:$1)?', $a); // optionalParam
$c = preg_replace('/(\(\?)?:\w+/', '([^\/]+)', $b); // namedParam
$d = preg_replace('/\*\w+/', '(.*?)', $c); // splatParam
$pattern = "/^{$d}$/";
echo "/^\/podcasts\/([^\/]+)\/([^\/]+)$/\n";
echo "{$pattern}\n";
$matches = array();
preg_match_all($pattern, '/podcasts/param1/param2', $matches);
print_r($matches);
我的输出是:
/^\/podcasts\/([^\/]+)\/([^\/]+)$/ // The expected pattern
/^/podcasts/([^\/]+)/([^\/]+)$/ // echo "{$pattern}\n";
Array // print_r($matches);
(
)
为什么我的正则表达式输出不同?我可以处理其余的映射过程,但我还没有弄清楚如何在 PHP 中获得与 Javascript 中完全相同的正则表达式。有什么建议么?