preg_replace不会#39;替换右边会添加额外的反斜杠

时间:2014-04-11 11:21:22

标签: php regex

大家好日子。我有以下两个函数,一个用于添加规则,另一个用于匹配该规则。问题是,当我使用两个参数时,其中一个没有改变,我不明白为什么它不起作用。任何帮助都是相关的。

public function add($name, $pattern, $controller, $action = null, array $params = array())
{
    if(!isset($this->routeCollection[$name]))
        $this->routeCollection[$name] =
    array(
        '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 array('controller' => $routeMap['controller'], 'action' => $routeMap['action']);
        }
    }

    return array('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);
        var_dump($this->finalRegex);
    } else {
        $this->finalRegex = '/^(' . preg_quote($uri, '/') . ')$/';
        $this->finalRegex = str_replace(array('\.', '\-'), array('.', '-'), $this->finalRegex);
    }

    return $this->finalRegex;
}

//用法:

$routeCollection->add('CatalogByCategory', '/catalog/category/{slugLink}', 'Ex:Controller:Catalog', 'ViewByCategory',
    array('slugLink' => ('[a-z0-9]+(?:-[a-z0-9]+)*') ));
$routeCollection->add('ListCatalogPageByCategory', '/catalog/category/{sluglinks}/{pageNumber}', 'Ex:Controller:Catalog', 'ListCatalog',
    array('sluglinks' => ('[a-z0-9]+(?:-[a-z0-9]+)*'), 'pageNumber' => ('[1-9][0-9]*') ));

//来自转储:

string '/^\/catalog\/category\/[a-z0-9]+(?:-[a-z0-9]+)*$/' (length=49)
string '/^\/catalog\/category\/\{sluglinks\}\/[a-z0-9]+(?:-[a-z0-9]+)*$/' (length=64)

1 个答案:

答案 0 :(得分:1)

    foreach ($this->matches as $isMatch) {
        // Swap {param} with a placeholder
        $this->uri = str_replace($isMatch, "%s", $uri);
    }

您继续覆盖$this->uri,并且$uri的值正在替换 - 在这种情况下,它会在{sluglinks}被替换后设置,然后再次使用进行设置 {pageNumber}被替换。

您应该使用$this->uri = $uri;,然后始终使用$this->uri