すでにPHPコントローラーを作成しましたが、コードを書き直して、URIパターンをPHP Class :: methodの組み合わせに、または直接HTMLドキュメントにマップしてクライアントに配信するバックボーンルーターのようなJSONルートを作成できるようにしています。 、 そのようです:
{
"/home" : "index.html",
"/podcasts": "podcasts.html",
"/podcasts/:param1/:param2": "SomeClass::someMethod"
}
バックボーンは、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とまったく同じ正規表現を取得する方法がわかりません。助言がありますか?