【问题标题】:Convert any title to url slug and back from url slug to title将任何标题转换为 url slug 并从 url slug 转换为标题
【发布时间】: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 还是数百万种不同组合中的任何其他?

标签: php string url-encoding slug


【解决方案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));
       }
      

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 2020-05-24
        • 2013-06-25
        • 2017-03-31
        相关资源
        最近更新 更多