我重写了URL以包含用户生成的travelblogs的标题。
我这样做是为了提高URL和SEO的可读性。
http://www.example.com/gallery/280-Gorges_du_Todra/
第一个整数是id,其余的是我们人类(但与请求资源无关)。
现在人们可以编写包含任何UTF-8字符的标题,但大多数都不允许在URL中。 我的听众通常都是说英语的,但是因为他们旅行,他们喜欢包括像
这样的名字Aït Ben Haddou
在Linux上使用PHP在URL中显示它的正确方法是什么。
到目前为止,我已经看到了几个解决方案:
只需删除所有不允许的字符,替换空格
这有奇怪的结果:
'Aït Ben Haddou' → /gallery/280-At_Ben_Haddou/
不是很有帮助。
只需删除所有不允许的字符,替换空格,最有可能因为使用“正则表达式”而留下charcode(stackoverflow.com)
这给出了奇怪的结果:
'tést tést' → /questions/0000/t233st-t233st
翻译成'最接近的等价物'
'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
但这对德国人来说是错误的;例如'ü'应该音译'ue'。
对我来说,作为荷兰人,第三个结果“看起来”最好 但我很确定(1)很多人会有不同的意见,(2)在德国的例子中,这是完全错误的。
第3个选项的另一个问题是:如何找到可以转换为7位等效字符的所有可能字符?
所以问题是:
在您看来,最理想的结果是什么。 (在技术限制范围内)
如何从技术上解决它。 (用PHP获得所需的结果)。
答案 0 :(得分:16)
最终,对于这个问题,你将不得不放弃“正确”的想法。无论你如何操作,翻译字符串都会破坏兼容性和可读性名称的准确性。所有三个选项都同样兼容,但#1和#2在可读性方面受到影响。因此,只需运行它并选择最佳效果 - 选项#3。
是的,德语的翻译是错误的,但除非您开始要求您的用户指定他们的标题所使用的语言(并将其限制为只有一种语言),否则您不会轻易解决该问题。这是值得的。 (例如,通过每个已知语言的字典运行标题中的每个单词,并根据其语言规则翻译该单词的变音符号 work ,但它过多。)
或者,如果德语比其他语言更受关注,请使您的翻译始终使用德语版本:ä
→ae
,{{1} }→ë
,e
→ï
,i
→ö
,oe
→ü
。
修改强>
哦,至于实际方法,我会通过ue
翻译特殊情况(如果有的话),然后使用str_replace
来完成剩下的工作:
iconv
答案 1 :(得分:3)
对我来说,第三个是最具可读性的。
你可以使用一个小词典,例如ï -> i
和ü -> ue
指定您希望如何翻译各种字符。
答案 2 :(得分:1)
作为一个有趣的旁注,在ID之后似乎没什么关系 - 这是这个页面的链接:
How to handle diacritics (accents) when rewriting 'pretty URLs'
显然,动机是允许在不破坏链接的情况下更改标题,您也可以考虑使用该功能。
答案 3 :(得分:1)
好主题,我前一段时间遇到了同样的问题 以下是我修复它的方法:
function title2url($string=null){
// return if empty
if(empty($string)) return false;
// replace spaces by "-"
// convert accents to html entities
$string=htmlentities(utf8_decode(str_replace(' ', '-', $string)));
// remove the accent from the letter
$string=preg_replace(array('@&([a-zA-Z]){1,2}(acute|grave|circ|tilde|uml|ring|elig|zlig|slash|cedil|strok|lig){1};@', '@&[euro]{1};@'), array('${1}', 'E'), $string);
// now, everything but alphanumeric and -_ can be removed
// aso remove double dashes
$string=preg_replace(array('@[^a-zA-Z0-9\-_]@', '@[\-]{2,}@'), array('', '-'), html_entity_decode($string));
}
以下是我的功能如何运作:
答案 4 :(得分:0)
现在人们可以编写包含任何UTF-8字符的标题,但大多数都不允许在URL中使用。
相反,大多数是允许的。例如,参见维基百科的URL - 像http://en.wikipedia.org/wiki/Café(又名http://en.wikipedia.org/wiki/Caf%C3%A9)这样的东西很好地显示 - 即使StackOverflow的荧光笔没有正确地选择它们: - )
诀窍是在任何托管环境中可靠地读取它们;例如,CGI和Windows服务器存在问题,尤其是IIS。
答案 5 :(得分:0)
这是一个很好的功能:
function friendlyURL($string) {
setlocale(LC_CTYPE, 'en_US.UTF8');
$string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
$string = str_replace(' ', '-', $string);
$string = preg_replace('/\\s+/', '-', $string);
$string = strtolower($string);
return $string;
}