Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel路由变量限制为17个字符_Php_Regex_Laravel_Routes - Fatal编程技术网

Php Laravel路由变量限制为17个字符

Php Laravel路由变量限制为17个字符,php,regex,laravel,routes,Php,Regex,Laravel,Routes,在Laravel中,我试图实现在URL中包含数量可变的类别,然后是slug的功能。例如: www.trashaccount.com/category1/category2/slug 我正在使用Laravel中的路线模式来识别类别 Route::pattern('cat', '([-a-zA-Z0-9]+\/?)*'); 演示/测试路线如下所示: Route::get('test/{cat}/{slug}', function($cat, $slug) { $categories = e

在Laravel中,我试图实现在URL中包含数量可变的类别,然后是slug的功能。例如:

www.trashaccount.com/category1/category2/slug

我正在使用Laravel中的路线模式来识别类别

Route::pattern('cat', '([-a-zA-Z0-9]+\/?)*');
演示/测试路线如下所示:

Route::get('test/{cat}/{slug}', function($cat, $slug) {
    $categories = explode('/', $cat);
    $i = 1;
    foreach($categories as $category)  {
        echo "category " . $i . ": " . $category . "<br>";
        $i++;
    }
    echo "slug: " . $slug . "<br>";
});
Route::get('test/{cat}/{slug}',函数($cat,$slug){
$categories=explode(“/”,$cat);
$i=1;
foreach($categories作为$category){
回显“类别”。$i.:“$category.”
”; $i++; } 回声“slug:.$slug.”
“; });
这可以在www.trashaccount.com/test/{cat}/../{slug}上进行测试

该代码成功地提取了任意字符长度的可变数量的类别;例如,这项工作:

在它中断的地方,是最后一个元素{slug}的字符数。出于某种原因,任何超过17个字符的内容都会抛出NotFoundHttpException。因此,这不起作用:

但是,如果您只是删除“r”(18h字符),它就可以工作

为了澄清(因为我的帖子在另一个论坛上被误解),你可以输入你想要的任意多个类别,它们可以是任意长度(尊重HTTP限制),它们将被接受和处理。我标记为{slug}的最后一个元素不能超过17个字符,否则会引发NotFoundHttpException错误

有人知道我做错了什么吗


谢谢

老实说,我觉得这种行为很奇怪

我没什么可做的,所以我开始研究拉威尔的内部代码,看看有什么不对,我得出结论,如果路线的最后一部分长度超过17个字符,那么它就失败了

每件事都发生在你的生活中

下面是一些使用
/test/first category/testingslug
的调试打印:

preg\u match(“^/assets/(;
//成功的
预匹配(“测试/测试/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]+)$s“,”/test/第一类/测试段”);
第一类:第一类
slug:测试slug
在我尝试使用长度超过17个字符的slug之前,一切都正常

我尝试使用
/test/first category/testingslagmuchlonger

preg#u match(“^/assets/(?P(?)\.\(.*))$#s“,“/test/first category/testingslugmuchlonger”);
//失败
预匹配(“测试/测试/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]+)$s“,“/测试/第一类/测试段长度”);
preg#u match(“/test/first category/testingslagmuchlonger”);
//再次失败
预匹配(“测试/测试/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]+)$s“,“/测试/第一类/测试段长度”);
它会重复,因为框架会检查是否存在具有..的替代路由。。中的路由相同,但方法不同

现在我尝试在单独的文件中调试这两个
preg_matc()

$works=null;
preg#u match(“#^/test/([-a-zA-Z0-9]+\/?)*)/([^/]+)$#s”、“/test/first category/testingslug”、$works);
var_dump($工程);
$FAILES=null;
预匹配(“^/测试/([-a-zA-Z0-9]+\/?)*)/([^/]+)$测试“,“/测试/第一类/TestingSlugmMuchlonger”,$失败);
var_dump($失败);
这就是他们的回报:

数组(4){
[0]=>
字符串(32)“/test/first category/testingslug”
[1]=>
字符串(14)“第一类”
[2]=>
字符串(14)“第一类”
[3]=>
字符串(11)“测试段塞”
}
数组(0){
}

在我看来,preg_match一定有问题(?)。

感谢@GiamPy对此进行调查,以及您在回答中所做的努力,非常感谢

我又把头撞在墙上几个小时,开始玩regex模式。我脑子里想不出我是在匹配类别的最后一个正斜杠,但也将正斜杠定义为路由中{cat}和{slug}之间的分隔符。这种怀疑引导我从结果中删除最后的前斜杠和slug

老实说,我不确定这是否是问题所在,因为我最终求助于复活节彩蛋正则表达式,直到我找到了一些有效的方法:

Route::pattern('cat2', '.+(?=\/.+)');
此模式匹配任何字符(.)一次或多次(),后跟(?=)正斜杠(/),任何字符(.)一次或多次(),但不将其包含在搜索中(正向前瞻的功能?=)

可在www.trashaccount.com/test2/cat1/cat2/veryverylongslughthastshouldbreak上进行验证


如果有人想纠正我,或在此基础上进行扩展,我们将不胜感激

改用此模式:

Route::pattern('cat', '[-a-zA-Z0-9]+(\/[-a-zA-Z0-9]+)*');

模式匹配表达式的方式与
([-a-zA-Z0-9]+\/?)*
相同,只是您可以确保{cat}永远不会以正斜杠结束我认为
{cat}
{slug}
之间的
/
cat
模式中匹配,当
{slug}
超过17个字符时,我不知道为什么。正如@GiamPy所说,这可能是
preg_match
函数中的一个bug。

将这一行添加到RouteServiceProvider.php上的引导函数中

Route::pattern(':route_variable', '[a-zA-Z-]{0,255}+');