Php Laravel正则表达式,用于未知长度的字符串分隔符的友好url

Php Laravel正则表达式,用于未知长度的字符串分隔符的友好url,php,regex,laravel,laravel-routing,Php,Regex,Laravel,Laravel Routing,在我的laravel应用程序中,我使用此路径捕获类别的友好URL: Route::get('/category/{friendlyUrl}', 'CategoryController@index')->where(['friendlyUrl' => '^([0-9A-Za-z\-]+)']); 问题是友好的url包含带破折号和类别id的字符串。我使用这个参数在php中拆分字符串以获得$id 是否可以通过使用laravel路由而不是在php中处理url从这些url捕获$id: /ca

在我的laravel应用程序中,我使用此路径捕获类别的友好URL:

Route::get('/category/{friendlyUrl}', 'CategoryController@index')->where(['friendlyUrl' => '^([0-9A-Za-z\-]+)']);
问题是友好的url包含带破折号和类别id的字符串。我使用这个参数在php中拆分字符串以获得$id

是否可以通过使用laravel路由而不是在php中处理url从这些url捕获$id:

/category/meble-barcelona-42479
/category/meble-do-kuchnii-43344
/category/some-random-url-lenght-ending-up-with-id-42479
友好url字符串的长度未知,它总是以破折号和id结尾。 预期路线应如下所示:

Route::get('/category/{friendlyUrl}{id}', 'CategoryController@index')
or
Route::get('/category/{friendlyUrl}-{id}', 'CategoryController@index')
通过使用某种正则表达式可以做到这一点吗


非常感谢你的建议

我认为您不能完全按照您想要的方式执行此操作,但您可以通过使用自定义路由绑定对其进行更改,使其在代码中更加隐藏:

路由服务提供商中

Route::bind('friendlyUrl', function($value)
{
    $parts = explode('-', $value);
    $id = array_pop($parts);
    return Category::findOrFail($id);
});
那么您的路线可以是:

public function index(Category $friendlyUrl) {
    // $friendlyUrl should have the correct Category based on the id at the end of the URL
}


这可能不是您想要的,但它至少是从slug id部分获取类别的一种可重复使用的方式。

我认为您不能完全按照您想要的方式来做,但您可以更改它,以便通过使用自定义路由绑定将其隐藏在代码中:

路由服务提供商中

Route::bind('friendlyUrl', function($value)
{
    $parts = explode('-', $value);
    $id = array_pop($parts);
    return Category::findOrFail($id);
});
那么您的路线可以是:

public function index(Category $friendlyUrl) {
    // $friendlyUrl should have the correct Category based on the id at the end of the URL
}


这可能不是您想要的,但它至少是从slug id部分获取类别的一种可重复使用的方法。

谁生成url??如果是你,为什么不使用标准的
category/{id}/{slug}
route格式?因为20000多个url在google中被索引,我无法更改它们。谁生成了url??如果是你,为什么不使用标准的
category/{id}/{slug}
route格式呢?因为20000多个URL在google中被索引,我无法更改它们。