将任何标题转换为url slug并从url slug转换回title

时间:2010-12-24 08:44:27

标签: php string url-encoding slug

我想转换任何标题,例如用户友好URL的博客条目。我使用rawurlencode()来做到这一点,但它给了我很多奇怪的字符串,如%s

该算法应该考虑像Ö,Ä等德语字符。我想从标题创建一个网址,并能够通过解码网址来获得标题。

我尝试了一些代码:http://pastebin.com/L1SwESBn在其他一些问题中提供,但它似乎是单向的。

E.g。 HÖRZU.de -> hoerzu-de -> HÖRZU.de

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

你想创造slu ,,但从经验我可以告诉你解码的可能性有限。例如“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;
}

答案 1 :(得分:2)

function url_title($str, $separator = 'dash', $lowercase = FALSE)
 {
  if ($separator == 'dash')
  {
   $search  = '_';
   $replace = '-';
  }
  else
  {
   $search  = '-';
   $replace = '_';
  }

  $trans = array(
      '&\#\d+?;'    => '',
      '&\S+?;'    => '',
      '\s+'     => $replace,
      '[^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 ($lowercase === TRUE)
  {
   $str = strtolower($str);
  }

  return trim(stripslashes($str));
 }

答案 2 :(得分:1)

我认为最优雅的方式是使用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