【问题标题】:Laravel 5.2 route regexLaravel 5.2 路由正则表达式
【发布时间】:2016-10-10 20:15:33
【问题描述】:

我正在尝试使用以下路由来捕获像 www.example.com/@username 这样的网址,但它给了我一个 404 错误。

Route::get('{user}', 'UserController@showProfile')->where('user', '(?<=\s|^)@([\w@]+)');

正则表达式工作得很好,因为如果我使用以下路线,它会输出正确的结果。

Route::get('{user}', 'UserController@showProfile')

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class UserController extends Controller
{
    public function showProfile($user)
    {
        $out = array();
        $re = "/(?<=\\s|^)@([\\w@]+)/";

        preg_match_all($re, $user, $out);

        dd($out);
    }
}

我做错了什么?

【问题讨论】:

    标签: php regex laravel laravel-5.2


    【解决方案1】:

    从您的路由正则表达式中删除您的lookbehind 和捕获组。尝试使用最简单的解决方案,例如^@[\w]+$。由于您的路线将始终以 @ 开头,而不是捕获用户名,因此您可以使用 $user = substr($user, 1);

    我还建议使用路由模型绑定,这样您就可以直接在控制器中拥有现有用户的实例。在您的 RouteServiceProvider@boot 中添加:

        $router->bind( 'user', function ( $username ) {
            return User::whereUsername( substr($username, 1) )->firstOrFail();
        });
    

    然后在您的控制器中,您的方法将如下所示:

    public function showProfile( User $user ){ ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2015-09-13
      • 2018-08-06
      • 2018-06-06
      • 1970-01-01
      • 2020-10-10
      相关资源
      最近更新 更多