PHP:调用preg_match的反向搜索顺序解决方案

PHP:调用preg_match的反向搜索顺序解决方案,php,preg-match,Php,Preg Match,我从我们的内部指导方针中采纳了建议的解决方案,再次感谢上级 我现在有以下代码: public function parseRequestedView($url) { $this->view_requested = explode('/', trim($url, '/')); // Format: [0] viewpoint, [1] child, [2] action (default: show), [3] reference $this->view_m

我从我们的内部指导方针中采纳了建议的解决方案,再次感谢上级

我现在有以下代码:

public function parseRequestedView($url) {

    $this->view_requested = explode('/', trim($url, '/'));

    // Format: [0] viewpoint, [1] child, [2] action (default: show), [3] reference
    $this->view_map = array(
        $this->parseViewMapArrayKey('device/:reference:/configurations') => array(0,  2, -1,  1),
        $this->parseViewMapArrayKey('device/:reference:')                => array(0, -1, -1,  1)
    );

    foreach ($this->view_map as $this->view_map_transitory => $this->view_map_indices) {

        if (preg_match($this->view_map_transitory, $url)) {

            foreach ($this->view_map_indices as $this->view_index) {

                $this->view_resources[] = $this->view_index > -1 ? $this->view_requested[$this->view_index] : null;

            }

            return $this->view_resources;

        }

    }

    return false;

}

public function parseViewMapArrayKey($key) {

    return '#'.str_replace([":reference:", ":string:"], ["\d+", ".+"], $key).'#';

}
除了一个小问题外,它工作正常:

当我切换键device/:reference:和device/:reference:/configurations,然后调用device/:reference:/configurations的视图时,我只得到device/:reference的结果

例如,将输出:

Array
(
    [0] => device
    [1] => 
    [2] => 
    [3] => 123456
)
这就是我们的结果。当我将钥匙更改回原来的顺序时,一切都应该是这样的:

Array
(
    [0] => device
    [1] => configurations
    [2] => 
    [3] => 123456
)
切换按键时,如何反转搜索顺序或使函数输出正确的结果

我找到了这个。但据我所知,这是一场消极的赛前比赛。还是我错了


提前谢谢。

好的,也许这是一个愚蠢的答案,但也许你可以确保你的正则表达式以^开头,以$结尾

比如说

public function parseViewMapArrayKey($key) {

    return '#^'.str_replace([":reference:", ":string:"], ["\d+", ".+"], $key).'$#';

}

问题是,当$$this->view\u map中的一个键第一次匹配时,您就从函数返回。因此,您需要按优先级顺序输入它们。如果不想更改首选项,为什么要切换按键?功能是否有办法自动计算优先级?然后使用一个排序函数按照这个顺序重新排序。谢谢你的回答。这不是一个真正的问题,只是想知道我的实现是否有问题,或者它是否按照设计工作,因为我对regex非常陌生。我不太了解你的应用程序,所以很难说。两个正则表达式都匹配URL,这应该发生吗?因为它们都匹配,所以顺序很重要,因为它使用第一个匹配的顺序。较长的正则表达式更为具体,因为它还检查:reference:之后的单词,所以您可能应该将其放在第一位。再次感谢。由于整个事情对时间至关重要,我将把这个问题添加到我的待办事项列表中,暂时不谈。但首先我将学习一些关于正则表达式的资料。也许你只需要在正则表达式的末尾添加一个$,这样“device/:reference:”将与URL不匹配http://ww.foo.com/device/123456/configurations. 正如我所说的,我不明白应用程序在做什么,所以我不知道这是否适合您的需要。