从变量PHP中的url获取id
从变量中的URL获取id时出现问题 Url类似于domain.com/article/1123/ 它就像是有很多id的动态 我想把1123保存在一个变量中,请帮忙 a用这个试过了从变量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 =
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