PHP& Apache - 解析mod_rewrite url

时间:2010-02-06 20:29:08

标签: php apache mod-rewrite preg-match

我将服务器的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,并中断操作。不知道我是否清楚自己......

3 个答案:

答案 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"
}

但是,只有当路径组件只降低一级时才会有效!