2

我将服务器的 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();
}

它总是显示该回显消息。我究竟做错了什么?

编辑 :

我需要正则表达式的原因如下。想象一下,我有一个 url 段,例如:

/user/yoda

此处的正则表达式可用于将第一个参数解析为操作或页面,将第二个参数解析为仅允许特定字符集的键,就像我希望在这种情况下,第二个参数仅匹配“_-azAZ09”,类似这样的东西。换句话说,我会将这组正则表达式与 uri 进行比较,以确定它们中的任何一个是否与 uri 匹配,并确定从那以后要采取的行动。使用explode 函数将使我稍后在代码中评估uri 段,这是我想避免的。如果 uri 不匹配,立即将页面转发到 404 页面并中断操作。不知道我有没有说清楚..

4

3 回答 3

3

为什么不使用正则表达式,而不是简单地拆分传入的 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段,我想避免这种情况

与其通过它的字符集来确保页面是有效的,为什么不编译一个有效页面查找表的列表并只使用in_array比正则表达式快得多的 php?将 URL 段提取到数组中将允许您立即验证多维数组。

于 2010-02-06T20:37:27.030 回答
1

我认为正则表达式需要被一个符号包围;例如'@(page(/<action>))@'请参阅http://php.net/preg_match中的示例

于 2010-02-06T20:48:21.180 回答
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"
}

但是,这仅在路径组件仅下降一级时才有效!

于 2010-02-06T20:59:13.577 回答