Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带正则表达式的Zend路由Url_Regex_Zend Framework_Url_Zend Route - Fatal编程技术网

Regex 带正则表达式的Zend路由Url

Regex 带正则表达式的Zend路由Url,regex,zend-framework,url,zend-route,Regex,Zend Framework,Url,Zend Route,我正在尝试创建一个将“覆盖”此类URL的路由: www.test.com/parent1/parent2/parent3/item www.test.com/parent1/parent2/parent3/parent4/item1 那个些父母的数量还并没有确定,这只会给网站URL提供更好、更直观的外观。主要参数是“item” 我想解决这个问题的唯一方法是使用Route_Regex,所以我尝试用如下方式完成这个Route任务: routes.test.type = "Zend_Controlle

我正在尝试创建一个将“覆盖”此类URL的路由:

www.test.com/parent1/parent2/parent3/item

www.test.com/parent1/parent2/parent3/parent4/item1

那个些父母的数量还并没有确定,这只会给网站URL提供更好、更直观的外观。主要参数是“item”

我想解决这个问题的唯一方法是使用Route_Regex,所以我尝试用如下方式完成这个Route任务:

routes.test.type = "Zend_Controller_Router_Route_Regex"
routes.test.route = "test/(?:.*)?([^\/]+)"
routes.test.defaults.module = default
routes.test.defaults.controller = test
routes.test.defaults.action = index
routes.test.map.1 = "path"
routes.test.map.2 = "item"
routes.test.reverse = "test/%s%s"
我没有做太多的测试,因为我不确定我是否做了正确的事情。。。我甚至不知道正则表达式应该是什么样子,我应该如何对待这个“路径”


你能建议我应该怎么做来满足这种路线需求吗?所以,我只需要该路径(parent1、parent2等)用于外观,主参数是“item”

我不知道zend route是什么(与php相关的东西?),但是如果你可以使用普通的编程函数,那么一个比正则表达式简单得多的解决方案就是使用内置的列表/拆分函数,例如:

end(explode($Url,'/'))

Url.split('/').last()

ListLast(Url,'/')


如果您确实需要正则表达式,只需使用以下方法即可:

[^/]+$
这将为您提供从最后一个正斜杠到行尾的所有内容。
(如果在需要转义的上下文中使用
/
,则只需用反斜杠转义。)



(顺便说一句,在你的例子中,你一开始就做了
test/
——这是故意的/必须的吗?

我知道这是一个老问题,但我有一个类似的问题,我想我应该发布我的解决方案。也许它可以帮助其他人看待这个问题

我在一个插件中编写了我的路由,显然你需要将插件添加到引导程序中,这样才能工作;)

这就是如何在控制器的操作中使用它

class PageController extends Zend_Controller_Action
{
    public function openAction()
    {
        // the part of the uri that you are interested in 
        $item = $this->_request->getParam('item');
    }
}
下面是一个如何将其包含到引导中的快速示例

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initPlugins()
    {
            $front_controller = Zend_Controller_Front::getInstance();

            $front_controller->registerPlugin(new Plugin_RoutesPage(), 1);
    }
}

我不得不使用两个路由,因为我们试图查看/打开的当前页面可能没有任何父级。我相信可能有更好的方法来编写正则表达式,但这对我来说是有效的。如果有人知道如何改进正则表达式,请告诉我。

如果父项完全不重要,一个简单的解决方案可能是在它们到达Zend之前删除它们-也就是说,重写URL,使它只看到
test/:item

例如,使用:

RewriteEngine On
RewriteRule ^(test/).*/([^/]+) $1$2  [L]
(可以根据需要明显改变“试验/部件”或使其动态化。)

这将进入站点的Apache配置文件,或者共享主机上的.htaccess文件


如果您不使用Apache,请检查您正在使用的任何web服务器的URL重写功能-语法可能略有不同,但会很相似。

Zend Route是Zend Framework的一部分,这是一个著名的PHP框架。这家伙有33k rep?这甚至不是你在那里写的PHP代码。Eduard,“这个家伙”在四年半前回答这个问题时没有33k rep,他故意提供伪代码来帮助OP(当时,没有其他人有),而不是忽略这个问题,因为他当时不知道他们在使用什么工具。
RewriteEngine On
RewriteRule ^(test/).*/([^/]+) $1$2  [L]