【问题标题】:Replace Spaces with Dash (-) in URL用破折号 (-) 替换 URL 中的空格
【发布时间】:2013-09-29 16:11:29
【问题描述】:

我正在开发我的第一个 Laravel 4 项目,并使用 eloquent ORM 通过路由从数据库中检索行。示例:

这是一条路线:

Route::get('{publisher}/{series}', function($publisher, $series)
{
$result = Comic::where('publisher', '=', $publisher)
->where('series', '=', $series)
->orderBy('issue', 'asc')
->get();

return View::make('comic')
->with('result', $result); 
});

这应该与诸如 site.com/marvel/amazing-spider-man 之类的 url 匹配

目前它仅适用于 site.com/marvel/amazing spider-man 或者 site.com/marvel/amazing%20spider-man

如何确保只使用“-”网址?我相信我需要做的是:

一个。编写在路由期间将“-”替换为 %20 的代码 湾。编写代码,在 url 生成期间将 %20 替换为“-”

另一个考虑因素是我真的不希望我的内容在两个 url 上都可以访问。

【问题讨论】:

  • 您所指的字符是减号。因为破折号是另一个更长的字符。

标签: php laravel laravel-4 eloquent


【解决方案1】:

我认为你没有得到你期望的结果的原因是因为“系列”名称存储在数据库中的格式,记住这是在寻找一个完全匹配,所以如果你想检索结果:

http://www.site.com/marvel/amazing-spider-man

您需要将它作为“amazing-spider-man”存储在数据库中以避免删除破折号 (-) 的额外步骤,如果您不喜欢这种格式,那么您可以这样做:

$series = str_replace('-', ' ', $series); 

这将删除破折号,但请注意不要在名称中使用破折号,因为它们会被删除,现在您可以将系列名称作为“神奇蜘蛛侠”存储在数据库中。

【讨论】:

  • 这是个好主意。问题是数据库有两种类型的标题,有些实际上是带有破折号的正式标题,有些则没有。数据库包含大约 200,000 行,重新做整个事情会很痛苦。另一种解决方案是在 URL 中使用某种 ID,例如 sitecom/marvel/3/amazing-spider-man,其中 id 仅映射到数据库?
【解决方案2】:

->with('result', Str::slug($result));

  • Str::slug(string $title, string $separator = '-')

http://laravel.com/docs/4.2/helpers#strings

【讨论】:

    【解决方案3】:

    截至 2021 年这是此类问题的第一个 Google 结果,有些人可能会欣赏我对此案例的解决方案,因为这在今天仍然适用。

    我使用公共*.csv 文件将国家和城市保存在我的数据库中。因此,像 OP 的问题一样,存在带有 破折号和空格的条目。

    另外,就像 OP 在他的评论中提到的那样,他必须重命名他的所有数据库条目。

    因此我对这个问题有一个很好的解决方案:

    1. 确保您的所有链接都带有下划线而不是空格,以提高可读性(也提高了 SEO),例如:

    $slug = str_replace(' ', '_', $this->country); // "United%20States" will be "United_States"

    1. 打开您的 MySQL 控制台并使用以下命令用下划线替换每个空格:

    UPDATE locations SET country = replace(country, ' ', '_');

    这样,带有连字符 (-) 的条目仍将保留在您的数据库中,而所有其他带有空格的条目都将有一个下划线以完全匹配。您还提高了 SEO 和 URL 的可读性。

    【讨论】:

      【解决方案4】:

      这是 Laravel 的解决方案。

      use Str;
      use Carbon\Carbon;
      
      $start_at = Str::replace('-', '/', '12-28-2021');
      Carbon::parse($start_at);
      

      【讨论】:

        猜你喜欢
        • 2013-01-14
        • 1970-01-01
        • 2013-12-11
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多