簡體   English   中英

PHP 帶有 switch 語句和正則表達式的路由器不起作用

[英]PHP router with switch statement and regular expressions not working

我在 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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM