使用PHP和regex自定义URL路由

zen*_*zen 2 php regex url-routing

我正在尝试创建一个非常简单的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
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我有"/ register"URI,它将匹配第二个elseif语句以及正则表达式语句.但我想避免必须从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
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 8

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

你已经做得对了,只要确保你先做字符串比较(==).

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

  • 创建自己的多个原因.如果你可以使用别人的工作,公司希望看到你能做什么,不关心.这也是一个很好的学习经验来创建自己的.通过这种方式,您将能够找出您的错误,甚至可能找到方法来加快脚本以满足您自己的需求等. (4认同)