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