Преобразуйте любой заголовок в 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