我将服务器的apache配置为将每个请求重定向到index.php,以便我可以使用以下网址:
http://www.website.com/about/us
现在我需要解析url以确定每条路由是否存在以及对它有什么期望,所以我可以设置一个数据库表来保存路由,这样我的客户就可以根据需要编辑路由了。事情是,到目前为止我无法进行解析。
这是我的代码:
$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
echo 'the route doesn\'t match';
exit();
}
它始终显示回显消息。我做错了什么?
编辑:
我需要正则表达式的原因如下。想象一下,我有一个网址片段,如:
/user/yoda
这里的正则表达式可以将第一个参数解析为一个动作或页面,第二个作为一个键只允许一组特征,就像我想要的那样,在这种情况下,第二个参数只匹配“_-azAZ09”,就像这样。换句话说,我将这组正则表达式与uri进行比较,以确定它们中的任何一个是否与uri匹配,并确定要从中进行的动作。使用explode函数会让我在代码的后面评估uri段,我想避免。如果与uri不匹配,立即将页面转发到404,并中断操作。不知道我是否清楚自己......
答案 0 :(得分:3)
为什么不简单地拆分传入的URI?而不是使用正则表达式?
$uri = 'about/us';
list($page, $action) = explode('/', $uri);
如果您需要两个以上,只需删除列表:
$pagePath = explode('/', $uri);
但是,如果你坚持使用正则表达式,那么这样做:
$regex = '#(?P<page>.*)/(?P<action>.*)#';
但是,除了$ match现在包含$matches['page']
和$matches['action']
之外,它没有什么特别之处 - 但是如果你真的需要它,你可以使用list()
,如上所示。
使用爆炸功能会 我后来评估了uri片段 代码,我想避免
为什么不编译有效页面查找表的列表而只是使用PHP的in_array
,而不是通过它的字符集确保页面有效?将URL段提取到数组中将允许您立即验证多维数组。
答案 1 :(得分:1)
我认为正则表达式需要被符号包围;例如'@(page(/<action>))@'
。请参阅http://php.net/preg_match
答案 2 :(得分:1)
如果您出于某种原因绝对必须使用正则表达式,请尝试以下方法:
$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);
哪个输出:
array(5) {
[0]=>
string(8) "about/us"
["path"]=>
string(5) "about"
[1]=>
string(5) "about"
["action"]=>
string(2) "us"
[2]=>
string(2) "us"
}
但是,只有当路径组件只降低一级时才会有效!