将任何标题转换为 url slug 并从 url slug 转换为标题
Posted
技术标签:
【中文标题】将任何标题转换为 url slug 并从 url slug 转换为标题【英文标题】:Convert any title to url slug and back from url slug to title 【发布时间】:2011-05-30 08:07:06 【问题描述】:我想转换任何标题,例如一个用户友好的 url 的博客条目。我使用rawurlencode() 来做到这一点,但它给了我很多奇怪的字符串,比如%s
。
该算法应考虑德语字符,如 Ö、Ä 等。我想从标题制作一个 url,并能够通过解码 url 来获取标题。
我尝试了其中一些代码:http://pastebin.com/L1SwESBn,它在其他一些问题中提供,但它似乎是一种方式。
例如HÖRZU.de -> hoerzu-de -> HÖRZU.de
有什么想法吗?
【问题讨论】:
你想创建 slug,但根据经验我可以告诉你解码的可能性是有限的。 你无法解码。这是单向的 你无法解码。您如何知道正确的解决方案是 HORZU.DE、Hörzu.de、HÖRZU.DE、Hòrzu.de、Hörzü.de 还是数百万种不同组合中的任何其他? 【参考方案1】:没有可靠的方法可以将蛞蝓“解码”回其原始形式。最好的解决方案是将 slug 及其原始数据存储在数据库中。
【讨论】:
【参考方案2】:您想创建 slug,但根据经验,我可以告诉您解码的可能性是有限的。例如,“Foo - Bar”将变成“foo-bar”,那么你怎么可能知道它一直不是“foo bar”或“foo-bar”?
或者你不想在你的 slug 中使用的字符怎么样,也没有像“`”这样的表示?
因此,您可以使用像rawurlencode()
这样的 1 对 1 转换,或者您可以创建一个 Slug,这是一个函数的示例 - 但正如我所说,不可能进行可靠的解码 - 它的本质是因为你必须扔掉信息。
function sanitizeStringForUrl($string)
$string = strtolower($string);
$string = html_entity_decode($string);
$string = str_replace(array('ä','ü','ö','ß'),array('ae','ue','oe','ss'),$string);
$string = preg_replace('#[^\w\säüöß]#',null,$string);
$string = preg_replace('#[\s]2,#',' ',$string);
$string = str_replace(array(' '),array('-'),$string);
return $string;
【讨论】:
【参考方案3】:我认为最优雅的方式是使用 Behat\Transliterator\Transliterator。
我需要通过你的类扩展这个类,因为它是一个抽象,有些像这样:
<?php
use Behat\Transliterator\Transliterator;
class Urlizer extends Transliterator
然后,只需使用它:
$text = "Master Ápiu";
$urlizer = new Urlizer();
$slug = $urlizer->transliterate($slug, "-");
echo $slug; // master-apiu
当然你也应该把这些东西放在你的作曲家中。
composer require behat/transliterator
更多信息在这里https://github.com/Behat/Transliterator
【讨论】:
这并没有回答 OP 的问题:如何将 slug 解码回原始形式?【参考方案4】:函数 url_title($str, $separator = 'dash', $lowercase = FALSE) if ($separator == '破折号') $搜索 = '_'; $replace = '-'; 别的 $搜索 = '-'; $replace = '_'; $trans = 数组( '&\#\d+?;' => '', '&\S+?;' => '', '\s+' => $替换, '[^a-z0-9\-\._]' => '', $replace.'+' => $replace, $replace.'$' => $replace, '^'.$replace => $replace, '\.+$' => '' ); $str = strip_tags($str); foreach ($trans as $key => $val) $str = preg_replace("#".$key."#i", $val, $str); if ($小写 === TRUE) $str = strtolower($str); 返回修剪(stripslashes($str));
【讨论】:
以上是关于将任何标题转换为 url slug 并从 url slug 转换为标题的主要内容,如果未能解决你的问题,请参考以下文章
清理 URL slug 的 Unicode 字符串(Ruby/Rails)
如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?