我将服务器的 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 匹配,并确定从此之后要采取的操作。使用爆炸函数将使我稍后在代码中评估 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()
如上所示。
Using the explode function would make me evaluate the uri segments later in the code, wich I'd like to avoid
与其通过字符集确保页面有效,为什么不编译有效页面查找表列表并仅使用 php 的 in_array
,它比正则表达式快得多?将 URL 段提取到数组中将使您能够立即验证多维数组。
关于PHP 和 Apache - 解析 mod_rewrite url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214603/