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