[英]PHP & Apache - parse mod_rewrite url
我将服务器的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”,像这样。 换句话说,我将把regex表达式集与uri进行比较,以确定它们中的任何一个是否与uri匹配,并确定从那以后要采取的措施。 使用explode函数会使我稍后在代码中评估uri段,但要避免。 如果找不到与uri匹配的内容,请立即将页面转发到404页面,然后中断操作。 不知道我是否说清楚了..
为什么不简单地拆分传入的URI,而不使用正则表达式?
$uri = 'about/us';
list($page, $action) = explode('/', $uri);
如果需要两个以上,只需删除列表:
$pagePath = explode('/', $uri);
但是,如果您坚持使用正则表达式,则可以这样做:
$regex = '#(?P<page>.*)/(?P<action>.*)#';
但是,它没有为您提供什么特别的功能,只是$ matches现在将包含$matches['page']
和$matches['action']
-但是,如果您确实需要它,可以使用如上所示的list()
。
使用explode函数将使我稍后在代码中评估uri段,但要避免
与其不通过字符集来确保该页面是有效的,何不编译一个有效页面查找表的列表,而只使用比正则表达式快得多的php in_array
? 将URL段提取到数组中将使您可以立即验证多维数组。
我认为正则表达式必须用符号包围; 例如'@(page(/<action>))@'
。 请参阅http://php.net/preg_match中的示例
如果出于某些原因绝对必须使用正则表达式,请尝试以下操作:
$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"
}
但是,这仅在路径组件仅下降一级时才有效!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.