首页 > 解决方案 > 如何在 php 中使用正则表达式检查数组上的 url?

问题描述

首先,我尝试了与该主题相关的所有问题和答案。此外,我尝试了相关问题并尝试解决但没有成功。所以请仔细阅读我的问题。

如何使用正则表达式模式检查 url 在我的路由上是否有效?

此代码不编写 "Core PHP"任何框架。

$routes = [
          'PUT' =>
              [
               '/order/{id}' => 'updateOrder'
              ],
          'GET' =>
              [
                '/order' => 'getOrder',
                '/order/{id}' => 'getOrder',
                '/order/status/{id}' =>'getOrderStatus'
              ],
          'POST' =>
              [
               '/order' =>'createOrder'
              ],
          'DELETE' =>
              [
                 '/order/{id}' => 'deleteOrder'
              ]
        ];

我的网址喜欢:

1) '/订单/BPQ153'

2) '/订单/状态/BPQ123'

3) '/订单'

标签: phpregex

解决方案


您可以简单地遍历路线并找到第一个匹配的路线。请注意,下面代码中的外部循环只是因为我正在检查您一次提供的所有示例 URL:

$routes = [
    'PUT' =>
        [
            '/order/{id}' => 'updateOrder'
        ],
    'GET' =>
        [
            '/order' => 'getOrder',
            '/order/{id}' => 'getOrder',
            '/order/status/{id}' => 'getOrderStatus'
        ],
    'POST' =>
        [
            '/order' => 'createOrder'
        ],
    'DELETE' =>
        [
            '/order/{id}' => 'deleteOrder'
        ]
];

$urlsToCheck = [
    '/order/BPQ153',
    '/order/status/BPQ123',
    '/order',
];

foreach ($urlsToCheck as $url) {
    foreach ($routes as $method => $methodValues) {
        foreach ($methodValues as $route => $function) {

            // match ID to everything that is not a slash
            $regex = str_replace('{id}', '([^\/]+)', $route);

            if (preg_match('@^' . $regex . '$@', $url)) {
                echo "The URL $url matches on $method HTTP method for function $function.";
                echo PHP_EOL;
            }
        }
    }
}

这输出:

The URL /order/BPQ153 matches on PUT HTTP method for function updateOrder.
The URL /order/BPQ153 matches on GET HTTP method for function getOrder.
The URL /order/BPQ153 matches on DELETE HTTP method for function deleteOrder.
The URL /order/status/BPQ123 matches on GET HTTP method for function getOrderStatus.
The URL /order matches on GET HTTP method for function getOrder.
The URL /order matches on POST HTTP method for function createOrder.

如您所见,我没有检查特定的 HTTP 方法,但您必须根据当前使用的 HTTP 方法在其中添加额外的检查。然而,这不是问题的一部分,所以我只是为了完整起见在这里提到它。

PS:对于更简洁的代码,您当然可以将其放入函数/方法/类中,我只是在这里尽量保持代码简短。


推荐阅读