Преобразуйте любой заголовок в URL slug и обратно из url slug в title

Я хочу преобразовать любой заголовок, например, записи блога в удобный url-адрес. Я использовал rawurlencode() чтобы сделать это, но это дает мне много странных строк типа %s.

алгоритм должен учитывать немецкие символы, такие как Ö, Ä и т. д. Я хочу сделать url из заголовка и иметь возможность получить заголовок, расшифровав url.

я попробовал некоторые из этого кода:http://pastebin.com/L1SwESBn это предусмотрено в некоторых других вопросах, но, похоже, один путь.

Е. Г. HÖRZU.de -> hoerzu-de -> HÖRZU.de

какие идеи?

3 ответов


вы хотите создать слизни, но по опыту я могу сказать, что возможности декодирования ограничены. Например, " Foo-Bar "станет" foo-bar", так как же вы тогда можете знать, что это не было" foo bar "или" foo-bar " все это время?

или как насчет символов, которые вы не хотите в своем слизняке, а также не имеете представления для " ` "? Таким образом, вы можете использовать эфир от 1 до 1, Как rawurlencode() или вы можете создать 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;
}

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));
 }

самый элегантный способ, который я думаю, использует 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