带有switch语句和正则表达式的PHP路由器无法工作



我在php:中有这段代码

$route = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
switch ($route) {
case '':
echo "root";
break;
case '/':
echo "root";
break;
case (preg_match("/^[a-zA-Z0-9-_]+$/", $route) ? true : false):
echo "db";
break;
default:
header("HTTP/1.0 404 Not Found");
http_response_code(404);
print(http_response_code());
break;
}

正则表达式必须匹配所有包含字母数字字符和-和_的路由。但事实并非如此,相反,所有都会滑动到默认选项404。

这可能是赛前开关内部的问题。请帮忙。

有几个问题:

  1. REQUEST_URI将返回以/开头的字符串,因此必须将其添加到正则表达式中:/^/[a-zA-Z0-9-_]+$/
  2. switch检查case的值是否与提供的值匹配,因此应将其与true而不是$route进行比较:
switch (true) {
case $route == '':
...
case $route == '/':
...
case preg_match("/^/[a-zA-Z0-9-_]+$/", $route):
...
}

但在这种情况下,最好使用简单的if条件:


if (empty($route) || $route == '/') {
echo 'root';
return; // Use early return in order not to jump to other cases
}
if (preg_match("/^/[a-zA-Z0-9-_]+$/", $route)) {
echo 'db';
return;
}

header("HTTP/1.0 404 Not Found");
http_response_code(404);
print(http_response_code());

最新更新