带参数的简单 Php 路由器

Simple Php router with parameters

我正在尝试在 PHP 中制作一个非常简单的路由系统。现在它看起来像这样:

function router() {
  if($url === '/login') {
    $page = '../private/login.php';
  }
  else if($url === '/password-recovery') {
    $page = '../private/pass-rec.php';
  }
  else if($url === "/password-reset") {
    $page = '../private/pass-reset.php';
  }
  include_once($page);
}

这工作正常,但我需要密码重置才能接受参数。像这样:

 else if($url === "/password-reset/[pattern here]") {
    $page = '../private/pass-reset.php?param=[pattern]';
  }

参数总是不同的,所以我需要它接受一个包含字母和数字的字符串,比如([a-zA-Z0-9])。我试过 preg_match() 但似乎没有任何效果。

如有任何帮助,我们将不胜感激!

您可以像这样使用 explode() 函数:

 $url = "/password-reset/somevalue";
 $url = explode('/', $url);
 if($url[1] === "password-reset") {
    $page = '../private/pass-reset.php?param='.$url[2];
  }
  

explode() 函数之后 $url 变量将如下所示:

$url = Array
(
    [0] => 
    [1] => password-reset
    [2] => somevalue
)

$page 变量将如下所示: $page = ../private/pass-reset.php?param=somevalue

为了简单起见,您可以只检查 URL 的第一部分,看看它是否与该路线匹配。

else if (substr($url, 0, 15) === "/password-reset") {
    $page = '../private/pass-reset.php';
    $param = substr($url, 16);
}

您不应像在问题的第二个代码块中那样将参数添加到 $page 变量,因为您将在 [=13] 中使用 $page =].如果您重定向到该页面,您会想要这样做,但由于 include_once 将在文件系统中查找它,因此将参数添加到路径将使其无法工作。

如果您像我展示的示例中那样提取参数,则包含的文件将可以访问该 $param 变量,以及 $url 和范围内的任何其他变量。

同样的想法也适用于 explode(),就像其他答案显示的那样,或者适用于 preg_match()。 (我不知道为什么 preg_match 对你不起作用,但它通常会起作用。)你获得 URL 部分的具体方式并不重要,只要它有效。