regex - 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
未找到 => 正确
怎么解决 谢谢
解决方案
经过测试,我认为不可能完全达到你想要的。似乎当您想要排除string1
并且string2
您需要同意以 和 开头的字符串也string1
将string2
被排除(例如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 而不是来自正则表达式。如果您还需要接受以开头的参数string1
,string2
我相信您需要以手动方式进行,如下所示:
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;
});
推荐阅读
- angular - node_modules/rxjs/internal/types.d.ts 中的角度错误
- c# - 如何反序列化具有来自不同类的对象的 JSON 字符串?
- r - 替换高频数据中的值
- python - Google Cloud Run - 如何设置“Access-Control-Allow-Origin”标头?
- python - QScintilla 中的 Pygments
- jenkins - 如何在不掩盖 withCredentials.usernamePassword 中的 PASSWORD 的情况下重用 Jenkins 凭据?
- python - 使用类将整数列出为字符串
- jquery - jquery库之间的兼容性问题
- python - 如何在 django-cms 中添加背景图片?
- python - 如何在循环中随机编辑 pcap 文件中的一个字节并且仍然有效?