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

2022-08-30 21:13:09

我重写了URL以包含用户生成的旅行博客的标题。

我这样做是为了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. 只需去除所有不允许的字符,替换空格,留下字符代码(stackoverflow.com),很可能是因为使用了
    “正则表达式锤”,这给出了奇怪的结果:'tést tést' → /questions/0000/t233st-t233st

  3. 翻译成“最接近的等价物”

    ,但对于德语来说,这是错误的;例如,“ü”应音译为“ue”。'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/

对我来说,作为一个荷兰人,第3个结果“看起来”最好。
然而,我很确定(1)许多人会有不同的看法,(2)在德国的例子中这是完全错误的。

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

所以问题是:

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

  2. 如何从技术上解决它。(达到所需的结果)与 PHP。


答案 1

最终,对于这个问题,你将不得不放弃“正确”的想法。翻译字符串,无论你怎么做,都会破坏兼容性和可读性名称的准确性。所有三个选项都同样兼容,但#1和#2在可读性方面受到影响。因此,只需使用它,然后选择看起来最好的方法 - 选项#3。

是的,德语的翻译是错误的,但除非你开始要求你的用户指定他们的标题是用什么语言(并限制他们只有一种),否则你不会解决这个问题,除非付出比它的价值更多的努力。(例如,通过每种已知语言的字典运行标题中的每个单词,并根据其语言规则翻译该单词的变音符号会起作用,但这是过度的。

或者,如果德语比其他语言更受关注,请让您的翻译始终使用德语版本(如果存在德语版本):→,→,→,→→。äaeëeïiöoeüue

编辑:

哦,至于实际的方法,我会翻译特殊情况,如果有的话,通过,然后用于其余的:str_replaceiconv

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);

答案 2

对我来说,第三个是最可读的。

你可以使用一个小字典,例如 并指定您希望如何翻译各种字符。ï -> iü -> ue


推荐