我有一个简单的问题,我必须从URL替换%20和其他废话。此刻看起来像这样http://exmaple/profile/about/Eddies%20Plumbing。如您所见,它是个人资料链接。
是的,我可以str_replace在每个超链接之前添加值,但是我喜欢其中的10个,我认为这是不好的做法。也许有更好的解决方案?您将使用什么解决方案?谢谢。
那不是废话,是空格字符的有效unicode表示。并对其进行了编码,因为它是RFC1738认为不安全的字符之一:
所有不安全字符必须始终在URL中编码。例如,
"#"即使在通常不处理片段或锚定标识符的系统中,字符也必须在URL中进行编码,因此,如果将URL复制到另一个使用它们的系统中,则无需更改URL编码。
因此,为了拥有漂亮的URL,应避免使用保留的和不安全的字符,这些字符需要编码才能作为URL的一部分有效:
保留字符:
$ & + , / : ; = ? @不安全字符:空格/空白和
< > # % { } | \ ^ ~ [ ] `
而是用破折号代替空格,破折号在视觉上起着相同的作用,同时又是一个安全的字符,例如,查看此问题的Stack Overflow URL。下面的URL看起来很好并且可读,没有空格:
http://exmaple/profile/about/eddies-plumbing
Run Code Online (Sandbox Code Playgroud)
您可以使用Laravel的str_slug帮助器功能来完成以下工作:
str_slug('Eddies Plumbing', '-'); // returns eddies-plumbing
Run Code Online (Sandbox Code Playgroud)
该str_slug做更多与破折号替代的空间,它会替换多个空格以单破折号,并剥离所有非字母数字字符,因此没有对其进行解码没有可靠的方法。
话虽如此,我不会一开始就使用这种方法。我通常使用两种主要方法来标识数据库条目:
1.通过ID
在您的情况下,路由路径定义如下所示:
/profiles/about/{id}/{slug?} // real path "/profiles/about/1/eddies-plumbing"
Run Code Online (Sandbox Code Playgroud)
用于标识用户的代码如下所示User::find($id)(slug不需要参数,它只是使URL更具可读性,这就是为什么我使用?使其成为可选的原因)。
2.通过子弹
在您的情况下,路由路径定义如下所示:
/profiles/about/{slug} // real path "/profiles/about/eddies-plumbing"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我总是将子弹存储为users表中的一列,因为它是与该用户相关的属性。因此检索过程非常容易User::where('slug', $slug)。str_slug当将用户保存到数据库时,当然可以使用生成有效的子弹。我通常会更好地喜欢这种方法,因为它具有让子弹成为您想要的任何东西的额外好处(实际上不需要从用户名生成)。这还可以允许用户选择其自定义URL,还可以帮助优化搜索引擎。
| 归档时间: |
|
| 查看次数: |
5452 次 |
| 最近记录: |