从变量PHP中的url获取id

从变量PHP中的url获取id,php,Php,从变量中的URL获取id时出现问题 Url类似于domain.com/article/1123/ 它就像是有很多id的动态 我想把1123保存在一个变量中,请帮忙 a用这个试过了 if(isset($_GET['id']) && !preg_match('/[0-9]{4}[a-zA-Z]{0,2}/', $_GET['id'], $id)) { require_once('404.php'); } else { $id =

从变量中的URL获取id时出现问题

Url类似于domain.com/article/1123/

它就像是有很多id的动态

我想把1123保存在一个变量中,请帮忙

a用这个试过了

    if(isset($_GET['id']) && !preg_match('/[0-9]{4}[a-zA-Z]{0,2}/', $_GET['id'], $id)) { 
        require_once('404.php'); 
    } else { 
        $id = $_GET['id']; 
    }

我会这样做:

使用/分解字符串。 获取分解数组的长度。 获取最后一个元素,它将是ID。 代码


这可以很简单地做到。首先,您应该使用包含URL的字符串创建一个变量。这可以通过$\u服务器阵列完成。这包含有关服务器的信息,以及您实际所在的URL

第二点是拆分URL。这可以通过不同的方式完成,我喜欢使用p_reg函数来分割它。在您的例子中,您希望在every/之后拆分,因为这样您将拥有一个包含URL的每个目录的数组

之后,只需在阵列中选择正确的位置

$path = $_SERVER['REQUEST_URI']; // /article/1123/
$folders = preg_split('/', $path); // splits folders in array
$your_id = $folders[1];

要彻底了解,您需要从以下内容开始

这将为您提供一个包含少量键的数组。你要找的是路径

在/上拆分路径并选择最后一条

$path_parts=explode('/', $parts['path']);

您的ID现在位于$path_parts[count$path_parts-1]中

您肯定应该使用parse_url来选择url的正确部分–以防url上存在查询或片段

$parts = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

$parts[0]; // 'domain.com'
$parts[1]; // 'article'
$parts[2]; // '1123'
您可能也希望将这些作为名称引用。您可以使用数组_combine优雅地实现这一点

我现在真的觉得自己是个拖拉者,所以我给你做了个小路由器。你现在不必费心太多地剖析它;首先学习如何使用它,然后你可以在以后把它拆开

function makeRouter ($routes, callable $else) {
  return function ($url) use ($routes, $else) {
    foreach ($routes as $route => $handler) {
      if (preg_match(makeRouteMatcher($route), $url, $values)) {
        call_user_func_array($handler, array_slice($values, 1));
        return;
      }
    }
    call_user_func($else, $url);
  };
}

function makeRouteMatcher ($route) {
  return sprintf('#^%s$#', preg_replace('#:([^/]+)#', '([^/]+)', $route));
}

function route404 ($url) {
  echo "No matching route: $url";
}
好的,在这里我们将定义我们的路线以及每条路线上应该发生什么

// create a router instance with your route patterns and handlers
$router = makeRouter([

  '/:domain/:resource/:id' => function ($domain, $resource, $id) {
    echo "domain:$domain, resource:$resource, id:$id", PHP_EOL;
  },

  '/public/:filename' => function ($filename) {
    echo "serving up file: $filename", PHP_EOL;
  },

  '/' => function () {
    echo "root url!", PHP_EOL;
  }
], 'route404');
现在让我们来看看它是否符合我们的要求

$router('/domain.com/article/1123');
// domain:domain.com, resource:article, id:1123

$router('/public/cats.jpg');
// serving up file: cats.jpg

$router('/');
// root url!

$router('what?');
// No matching route: what?

是的,我真的对我当前的工作任务感到厌烦…

完成这项任务最简单的方法就是使用basename

哪个会打印

1123

参考url

出现了什么问题?你做了什么没有得到它?你在使用一个框架吗?如果是这样的话,你可能不需要这个家伙的正则表达式。如果答案解决了你的问题,考虑接受答案。下面是如何返回此处并对勾号/复选标记执行相同操作,直到其变为绿色。这将通知社区,找到了解决方案。否则,其他人可能会认为问题仍然悬而未决,并可能希望发布更多答案。您将获得积分,并鼓励其他人帮助您。欢迎来到Stack@JayBlanchard preg_split?这很像explode。@JayBlanchard preg_*函数用于Perl正则表达式……我知道@naomik,但这里的成本不超过explode@JayBlanchard这不是争论的焦点;你刚才说没有正则表达式,但我想每次都从当前url保存id,而不仅仅是从一个url,然后将包含url的变量传递给basename0函数。谢谢jay blanchard,你能给我一个basename的示例吗!对不起,我的PHP不太好这对我不起作用,或者我做错了什么可以您是否将$url定义为当前url@amokkhan@PraveenKumar是的,只需一个链接,这是一个很好的解决方案,但我需要一个动态url,如“domain.com/article/1123”和“domain.com/article/2342/”thanks@amokkhan您需要将URL设置为$URL=$\u服务器[请求\u URI]。它应该按预期工作,因为$_服务器[REQUEST_URI]是基于您当前的URL动态的。@PraveenKumar好的,谢谢我必须复制它,所以$URL=$_服务器[REQUEST_URI]$url=explode/,$url$id=$url[count$url-1];
// create a router instance with your route patterns and handlers
$router = makeRouter([

  '/:domain/:resource/:id' => function ($domain, $resource, $id) {
    echo "domain:$domain, resource:$resource, id:$id", PHP_EOL;
  },

  '/public/:filename' => function ($filename) {
    echo "serving up file: $filename", PHP_EOL;
  },

  '/' => function () {
    echo "root url!", PHP_EOL;
  }
], 'route404');
$router('/domain.com/article/1123');
// domain:domain.com, resource:article, id:1123

$router('/public/cats.jpg');
// serving up file: cats.jpg

$router('/');
// root url!

$router('what?');
// No matching route: what?
echo basename('domain.com/article/1123');
1123