【问题标题】:PHP: Solution for reverse order of search invoking preg_matchPHP:调用 preg_match 的反向搜索顺序的解决方案
【发布时间】:2012-12-25 11:14:19
【问题描述】:

我从PHP: Good solution for MVC routing function to parse requested views? 那里获得了建议的解决方案,并将其调整为我们的内部准则(再次感谢 Supericy)。

我现在有以下代码:

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 的结果。

例如,http://ww.foo.com/device/123456/configurations 将输出:

Array
(
    [0] => device
    [1] => 
    [2] => 
    [3] => 123456
)

这是http://ww.foo.com/device/123456 的结果。当我将键改回原来的顺序时,一切都应该是这样的:

Array
(
    [0] => device
    [1] => configurations
    [2] => 
    [3] => 123456
)

如何在切换按键时反转搜索顺序或使函数输出正确的结果?

我找到了这个PHP Reverse Preg_match。但据我所知,这是一个负的 preg_match 。还是我错了?

提前致谢。

【问题讨论】:

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

标签: php preg-match


【解决方案1】:

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

例如

public function parseViewMapArrayKey($key) {

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多