Конвертировать любой заголовок в URL-слаг и обратно из URL-слаг в заголовок - PullRequest
9 голосов
/ 24 декабря 2010

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

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

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

например. HÖRZU.de -> hoerzu-de -> HÖRZU.de

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 24 декабря 2010

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

Или как насчет символов, которые вам не нужны в вашем слаге, а также не имеют представления для символа "` "?Таким образом, вы можете использовать эфир 1: 1, например rawurlencode(), или создать слаг, вот пример для функции - но, как я уже сказал, надежное декодирование невозможно - это просто по своей природе, поскольку вы должны выброситьИнформация.

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;
}
2 голосов
/ 24 декабря 2010
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));
 }
1 голос
/ 14 декабря 2016

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

...