我想转换任何标题,例如用户友好URL的博客条目。我使用rawurlencode()来做到这一点,但它给了我很多奇怪的字符串,如%s
。
该算法应该考虑像Ö,Ä等德语字符。我想从标题创建一个网址,并能够通过解码网址来获得标题。
我尝试了一些代码:http://pastebin.com/L1SwESBn在其他一些问题中提供,但它似乎是单向的。
E.g。 HÖRZU.de -> hoerzu-de -> HÖRZU.de
有什么想法吗?
答案 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