0

こんにちは、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;
    }
}
4

1 に答える 1

3

提供されたものに noが含まれている場合、buildRegex()メソッドは戻ります。 NULL$uri{...}

NULL空の正規表現です。

ソリューション?常にbuildRegex()正規表現を返すようにします!

于 2013-01-25T10:01:49.520 に答える