Laravel 提供 where
方法和 Route::pattern
方法,用于设置某个路由参数必须匹配指定表达式,则此路由才会被匹配。
那么,如何设置排除某个「关键词」(或者我们称它为「特殊参数值」),只有这个关键词不匹配,其它都匹配呢?
举个例子
Route::domain('{user}.example.com');
Route::pattern('user', '???');
???
处代表二级域,通常不可以设置为一些敏感保留词,比如 www
/ admin
等。
解决方案
实际上,Laravel 的路由参数匹配,使用的正是正则表达式。所以,这就好办了。
根据业务逻辑,这里分两种情况。
全字匹配。
例如,刚刚那种情况。
www
肯定不可以,但包含www
的字符串是可以的。正则:
.*(?<!^www)
如果需要匹配多个,可以:
.*(?<!^www|admin)
。模糊匹配。
例如,不能包含
fuck
/porn
等,字符串何处都不允许包含此类关键词。正则:
((?!fuck).)*
同理,匹配多个:
((?!fuck|porn).)*
。
感言
近期又开始摸 Laravel,还是一如既往的性感。