小编Ósc*_*ios的帖子

在PHP中使用动态正则表达式的类骨干路由器

我已经编写了一个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)

php regex router backbone.js

6
推荐指数
1
解决办法
563
查看次数

标签 统计

backbone.js ×1

php ×1

regex ×1

router ×1