使用PHP和regex自定义URL路由


Custom URL routing with PHP and regex

我正在尝试创建一个非常简单的URL路由,我的想法是:

  • 首先检查所有静态URL
  • 然后检查数据库URL
  • 如果两者都不存在,则返回404

当然,静态URL很容易实现,但我正在努力找出实现动态URL的最佳方法。我宁愿不必设置静态前缀,尽管我知道这会使代码更容易编写。

这就是我目前拥有的:

$requestURL = $_SERVER['REQUEST_URI'];
if ($requestURL == '/') {
    // do stuff for the homepage
}
elseif ($requestURL == '/register') {
    // do stuff for registration
}
// should match just "/some-unique-url-here"
elseif (preg_match("/(['/A-Za-z0-9'-]+)/",$requestURL)) { 
    // query database for that url variable
}
// should match "/some-unique-url/and-another-unique-url"
elseif (preg_match("(^'/[A-Za-z0-9'-]+'/[A-Za-z0-9'-]+)/",$requestURL)) {
    // query database for first and second variable
}
else {
    // 404 stuff
}

我的问题是,如果我有"/register"URI,它将匹配第二个elseif语句和regex语句。但我想避免从regex语句中专门排除每个静态URL,例如:

// should match just "/some-unique-url-here"
elseif ((preg_match("/(['/A-Za-z0-9'-]+)/",$requestURL)) &&
    ($requestURL !== '/register') &&
    ($requestURL !== '/')) { 
    // query database for that url variable
}

解决这个问题最简单的方法是什么?我可能会有15-20个静态URL,所以特别是排除所有这些URL会非常麻烦。

您的问题不存在。如果第一个elseif ($requestURL == '/register')匹配,则不会评估同一级别上的所有后续elseif

您已经做对了,只需确保先进行字符串比较(==)。

另一方面,不要重新发明轮子。

  • https://github.com/bramus/router
  • http://toroweb.org/
  • http://zaphpa.org/