将任何标题转换为 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 转换为标题的主要内容,如果未能解决你的问题,请参考以下文章

创建用户后无法为“page_slug”生成 URL

清理 URL slug 的 Unicode 字符串(Ruby/Rails)

如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?

存储唯一 URL Slug 的最佳方式是啥?

如何在 Magento 中使用产品 URL 附加类别和子类别 slug

如何将 DetailView 传递给 url 中的“slug”?