19

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

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

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

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

现在人们可以编写包含任何 UTF-8 字符的标题,但大多数都不允许在 URL 中。我的听众一般说英语,但由于他们旅行,他们喜欢包括像这样的名字

阿伊特·本·哈杜

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

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

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

  2. 只需删除所有不允许的字符,替换空格,留下字符代码(stackoverflow.com),很可能是因为使用了“regex-hammer”,
    这会产生奇怪的结果: 'tést tést' → /questions/0000/t233st-t233st

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

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

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

所以问题是:

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

  2. 如何在技术上解决它。(达到预期的结果)用 PHP。

4

6 回答 6

16

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

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

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

编辑:

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

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
于 2009-01-21T17:06:37.080 回答
3

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

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

于 2009-01-21T16:41:06.743 回答
1

作为一个有趣的旁注,在 ID 之后似乎没有什么真正重要 - 这是此页面的链接:

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

显然,这样做的动机是允许在不中断链接的情况下更改标题,您可能也需要考虑该功能。

于 2009-01-21T17:23:27.953 回答
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. 删除所有剩余的奇怪字符
于 2010-01-23T21:38:11.650 回答
0

现在人们可以编写包含任何 UTF-8 字符的标题,但大多数都不允许在 URL 中。

相反,大多数是允许的。参见例如 Wikipedia 的 URL——像http://en.wikipedia.org/wiki/Café(又名http://en.wikipedia.org/wiki/Caf%C3%A9)这样的东西显示得很好——即使 StackOverflow 的荧光笔没有t 正确挑选它们:-)

诀窍是在任何托管环境中可靠地读取它们;例如,CGI 和 Windows 服务器(尤其是 IIS)存在问题。

于 2009-01-21T17:40:58.103 回答
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;
}
于 2014-11-24T12:54:02.123 回答