用PHP和Regex进行路径解析

用PHP和Regex进行路径解析,php,regex,url-routing,Php,Regex,Url Routing,我需要一些关于基于PHP的路径解析器的帮助,我正在尝试创建一个路径路由器,它从给定字符串中获取参数并返回一个包含结果的键控数组。我可以在一个完整的循环中完成,每个区域都被分解并单独测试,但我觉得应该有一种方法作为一个信号器regex来完成,然后循环结果 users//=users/1 | | users/42!=用户/鲍勃 返回args['id']=1 | | args['id']=42 用户/寄存器 args=[] name/=name/bob/smith | | name/jordan/fr

我需要一些关于基于PHP的路径解析器的帮助,我正在尝试创建一个路径路由器,它从给定字符串中获取参数并返回一个包含结果的键控数组。我可以在一个完整的循环中完成,每个区域都被分解并单独测试,但我觉得应该有一种方法作为一个信号器regex来完成,然后循环结果

users//=users/1 | | users/42!=用户/鲍勃
返回args['id']=1 | | args['id']=42
用户/寄存器
args=[]
name/=name/bob/smith | | name/jordan/freeman
args['fname']=bob | | args['fname']=jordan
args['lname']=smith | | args['lname']=freeman

命名捕获是我一直在寻找的,只需要转换我的标记或重做图案。

这是我能想出的,IDK如果它能帮助其他人

$str = 'user/1/';
$reg = "user\/(?P<ID>\d+)\/";

var_dump(testPath($str, $reg));

$str = 'user/bob/smith/';
$reg = "user\/(?P<fname>[a-zA-Z]+)\/(?P<lname>[a-zA-Z]+)\/";

var_dump(testPath($str, $reg));

function testURL($url, $reg){
    if(preg_match("/^$reg$/", $url, $matches)){
        return $matches;

    }else{
        return null;
    }
}
$str='user/1/';
$reg=“用户\/(?P\d+)\/”;
变量转储(testPath($str,$reg));
$str='user/bob/smith/';
$reg=“user\/(?P[a-zA-Z]+)\/(?P[a-zA-Z]+)\/”;
变量转储(testPath($str,$reg));
函数testURL($url,$reg){
if(preg_match(“/^$reg$/”,$url,$matches)){
返回$matches;
}否则{
返回null;
}
}

如果使用while循环,不要使用regex。如果OP认为使用regex解决方案比使用while循环更快、更有效,那么使用regex解决方案没有什么错。只要模式清晰,正则表达式很可能是实现这一点的理想工具,并且不会“影响”任何东西。(希望我能帮你。PHP不是我的游戏。谢谢,不想使用循环的原因是这个函数将在一个已经嵌套的循环中调用,并将解析数百条路径。不是一个理想的循环候选者,但命名为captures PHP 5.2 addition正是我在寻找的。我从一篇相关文章中发现它听起来像对我来说,这是一个糟糕的方法。如果你检查的路由数量很多,那么你会将每个路由与一些正则表达式进行比较。与解析路由的第一段、确定将其交给哪个控制器,然后让控制器梳理相比,这可能会相对缓慢以它认为合适的方式执行其余的操作/参数可能会快得多。我曾考虑过这样做,但最终我还是决定这样做,因为还有其他需要。我正在编译正则表达式并将它们存储在缓存中,因此我不需要在每次执行时都构建它们,这样可以减少性能损失,并增加额外的安全性。因为我可以忽略这些内容在验证路径之前,它还允许两个控制器使用相同的路径,或者一个控制器具有两个不同的入口点。我承认,它满足了一个非常特殊的需求,您可能不会将其作为标准框架的一部分使用