こんにちは、URLから正規表現を作成するために使用する次のコードがあります。問題は、メソッドに特定のパラメーターを渡さないと、次のエラーが発生することです。
Warning: preg_match(): Empty regular expression on line 27
これはコードです:
public function buildRegex($uri, array $params)
{
// Find {params} in URI
if(preg_match_all('/\{(?:[^\}]+)\}/', $uri, $this->matches, PREG_SET_ORDER))
{
foreach($this->matches as $isMatch)
{
// Swap {param} with a placeholder
$this->uri = str_replace($isMatch, "%s", $uri);
}
// Build final Regex
$this->finalRegex = '/^' . preg_quote($this->uri, '/') . '$/';
$this->finalRegex = vsprintf($this->finalRegex, $params);
return $this->finalRegex;
}
}
私がこのように使うとき:
$routeCollection->add('index', '/index.php/index/home/{name}', 'SiteName:Controller:Index', 'Home', ['name' => '(\w+)']);
それは問題なく動作しますが、params がなく、次のようなものを渡すだけの場合:
$routeCollection->add('contact', '/index.php/contact/', 'SiteName:Controller:Contact', 'index');
そのエラーが発生します。とにかく、私はアイデアがないので、この問題を解決する手を貸してください。
クラスのコード全体:
class RouterCollection
{
public $routeCollection = [];
public function add($name, $pattern, $controller, $action = null, array $params = [])
{
if(!isset($this->routeCollection[$name]))
$this->routeCollection[$name] =
[
'pattern' => $pattern,
'controller' => $controller,
'action' => $action,
'params' => $params,
];
}
public function findMatch($url)
{
foreach($this->routeCollection as $routeMap)
{
$this->regex = $this->buildRegex($routeMap['pattern'], $routeMap['params']);
// Let's test the route.
if(preg_match($this->regex, $url))
{
return ['controller' => $routeMap['controller'], 'action' => $routeMap['action']];
}
else
{
return ['controller' => $this->routeCollection['404']['controller'], 'action' => $this->routeCollection['404']['action']];
}
}
}
public function buildRegex($uri, array $params)
{
// Find {params} in URI
if(preg_match_all('/\{(?:[^\}]+)\}/', $uri, $this->matches, PREG_SET_ORDER))
{
foreach($this->matches as $isMatch)
{
// Swap {param} with a placeholder
$this->uri = str_replace($isMatch, "%s", $uri);
}
// Build final Regex
$this->finalRegex = '/^' . preg_quote($this->uri, '/') . '$/';
$this->finalRegex = vsprintf($this->finalRegex, $params);
return $this->finalRegex;
}
}
public function getCollection()
{
return $this->routeCollection;
}
}