首页 > 解决方案 > Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词

问题描述

我做了一个像

Route::get('/{url1}', function ($url1) {
    return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');

并访问如下网址:
-domain/abc 未找到 => 不正确??
-domain/string1未找到 => 正确

还有更多,当我做

Route::get('/{url1}/{url2}', function ($url1) {
    return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');

并访问网址,例如:
-domain/abc/abc 未找到 => 不正确???
-domain/string1/abc未找到 => 正确

怎么解决 谢谢

标签: regexlaravellaravel-5laravel-routing

解决方案


经过测试,我认为不可能完全达到你想要的。似乎当您想要排除string1并且string2您需要同意以 和 开头的字符串也string1string2被排除(例如string1aaa)。

使用此类路线时:

Route::get('/{url1}', function ($url1) {
    return ' url1: '.$url1;
})->where('url1', '(?!string1|string2)[^\/]+');


Route::get('/{url1}/{url2}', function ($url1, $url2) {
    return ' url1: '.$url1. ' # '.$url2;
})->where('url1', '(?!string1|string2)[^\/]+');

结果将是:

domain/abc - found, correct
domain/string1 - not found, correct
domain/abc/abc - found, correct
domain/string1/abc - not found, correct
domain/string1aaa - not found, I believe you need to accept this
domain/string1aaa/abc - not found, I believe you need to accept this

我相信这种限制来自 Laravel 而不是来自正则表达式。如果您还需要接受以开头的参数string1string2我相信您需要以手动方式进行,如下所示:

Route::get('/{url1}', function ($url1) {
    if (!preg_match('#^(?!string1$|string2$)[^\/]*$#', $url1)) {
        abort(404);
    }

    return ' url1: '.$url1;
});


Route::get('/{url1}/{url2}', function ($url1, $url2) {
    if (!preg_match('#^(?!string1$|string2$)[^\/]*$#', $url1)) {
        abort(404);
    }

    return ' url1: '.$url1. ' # '.$url2;
});

推荐阅读