自分のニーズに合わせて独自の正規表現を1つ作成するのに苦労しています。Doctrine以外はフレームワークを使わないようにしているアプリですが、その場合は問題ありません。フロントコントローラーパターンを使用しており、アノテーションを使用してルートをコントローラーのメソッドにマッピングしています。
お気に入り:
/**
* @GetMethod
* @Route(name=index)
* @return UserProfileDto
*/
public function getUserProfile();
必要なものすべてに一致する単一の正規表現を作成するのを手伝ってくれる人はいますか?
ルールは次のとおりです。
必須:
- コントローラー ( /controller、URL の最初の項目)
- タイプ (.json、.xml、.html、...)
オプション:
- アクション ( /controller/action、URL の 2 番目の項目)
- パラメーター (アクションとタイプの間のすべて、 /controller/action/param1/param2/param3.type )
これが私がなんとかしたことです:
<?php
header("content-type: text/plain");
// example url access: /profile/edit/23.html, /profile/delete/2.json, /profile.xml, /user/list.xml
$string = $_GET['u'];
$matches = array();
$objRoute = new stdClass();
preg_match_all("~^/(?P<controller>[^/\\.]+)~", $string, $matches);
if ($matches && $matches['controller']) {
$objRoute->controller = $matches['controller'][0];
} else {
$objRoute->controller = "index";
}
preg_match_all("~^/$objRoute->controller/(?P<action>[^/\\.]+)~", $string, $matches);
if ($matches && $matches['action']) {
$objRoute->action = $matches['action'][0];
preg_match_all("~^/$objRoute->controller/{$objRoute->action}(?:/[^\\.]+)?\\.(?P<type>.+)$~", $string, $matches);
} else {
preg_match_all("~^/$objRoute->controller\\.(?P<type>.+)$~", $string, $matches);
$objRoute->action = "index";
$objRoute->parameters = null;
}
if ($matches && $matches['type']) {
$objRoute->type = $matches['type'][0];
preg_match_all("~^/$objRoute->controller/{$objRoute->action}(?:/(?P<parameters>[^\\.]+))?\\.{$objRoute->type}$~", $string, $matches);
if ($matches && $matches['parameters'] && $matches['parameters'][0]) {
$objRoute->parameters = explode("/",$matches['parameters'][0]);
} else {
$objRoute->parameters = null;
}
} else {
die("Bad Request, no reponse type provided");
}
// "advanced" example method route @Route(name=edit/{id})
$route = "edit/{id}";
$route = preg_replace("~\\{([^\\}]+)\\}~", '(?P<' . '${1}' . '>[^/]+)', $route);
$routeTo = $objRoute->action . "/" . implode("/",$objRoute->parameters);
if ($objRoute->parameters && count($objRoute->parameters)) {
preg_match_all("~^$route$~", $routeTo , $matches);
}
foreach($matches as $idx => $match) {
if ($match && $match[0] && !is_numeric($idx)) {
$objRoute->{$idx} = $match[0];
}
}
print_r($objRoute);
?>