重写'漂亮的URL'时如何处理变音符号(重音符号)

时间:2009-01-21 16:34:55

标签: php url-rewriting diacritics

我重写了URL以包含用户生成的travelblogs的标题。

我这样做是为了提高URL和SEO的可读性。

 http://www.example.com/gallery/280-Gorges_du_Todra/

第一个整数是id,其余的是我们人类(但与请求资源无关)。

现在人们可以编写包含任何UTF-8字符的标题,但大多数都不允许在URL中。 我的听众通常都是说英语的,但是因为他们旅行,他们喜欢包括像

这样的名字
 Aït Ben Haddou

在Linux上使用PHP在URL中显示它的正确方法是什么。

到目前为止,我已经看到了几个解决方案:

  1. 只需删除所有不允许的字符,替换空格 这有奇怪的结果:
    'Aït Ben Haddou' → /gallery/280-At_Ben_Haddou/
    不是很有帮助。

  2. 只需删除所有不允许的字符,替换空格,最有可能因为使用“正则表达式”而留下charcode(stackoverflow.com) 这给出了奇怪的结果: 'tést tést' → /questions/0000/t233st-t233st

  3. 翻译成'最接近的等价物' 'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    但这对德国人来说是错误的;例如'ü'应该音译'ue'。

  4. 对我来说,作为荷兰人,第三个结果“看起来”最好 但我很确定(1)很多人会有不同的意见,(2)在德国的例子中,这是完全错误的。

    第3个选项的另一个问题是:如何找到可以转换为7位等效字符的所有可能字符?

    所以问题是:

    1. 在您看来,最理想的结果是什么。 (在技术限制范围内)

    2. 如何从技术上解决它。 (用PHP获得所需的结果)。

6 个答案:

答案 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));
}

以下是我的功能如何运作:

  1. 将其转换为html实体
  2. 去除重音
  3. 删除所有剩余的奇怪字符

答案 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;
}