多语言站点的SEO友好URLs

3

我正在使用php构建一个网站,允许多语言内容。 网站的一部分将包含业务列表。 我已设置SEO友好的url以查看这些列表,例如,我将有一个名为“街上的酒吧”的商家列表。 url将如下所示:

/listing/a-bar-down-the-street

然而,假设有一个阿拉伯语版本的此列表,则名称将如下所示:
شريط أسفل الشارع
我该如何将其转换为与英文版本相同的url格式,但在当前语言中?当我尝试将我的函数用于阿拉伯语版本时,它返回为空。
编辑: 进一步说明,我要找的只是一个php函数,它允许我将任何字符串转换为SEO友好的url,无论网站使用什么语言。
编辑第2部分 以下是我用于重写字符串为SEO友好的url的函数。也许您可以告诉我需要添加什么来使其支持多语言?
    public function urlTitle($str,$separator = 'dash',$lowercase = TRUE)
    {

        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);
        $str = preg_replace("#\/#ui",'-',$str);

        foreach ($trans AS $key => $val)
        {

            $str = preg_replace("#".$key."#ui", $val, $str);

        }

        if($lowercase === TRUE)
        {

            $str = mb_strtolower($str);

        }

        return trim(stripslashes($str));

    }

这个链接可能对你有帮助:http://www.stackoverflow.com/questions/9511254/how-to-create-unicode-slug-for-unicode-title - uttam
@uttam 很抱歉,服务器上没有安装规范化程序,我也不认为我能够安装它。 - John
4个回答

1

我在现有的SO 讨论 中找到了类似的讨论。看起来你所请求的应该是“开箱即用”的。

我建议您查看您的Web服务器配置以查看问题所在,SEO友好的英文URL和任何其他可编码字符串之间不应有区别。

您正在运行什么Web服务器?

更新 我看到您只接受字母数字字符:

'[^a-z0-9\-_]'          => '',

我怀疑您的过滤器可能会过滤掉任何非a-z字符并导致空返回。或者,您可以尝试调试您的函数,看看哪个替换条件导致您的内容被清除。

您在这里遇到的问题是,默认情况下,URL不能包含任何字符,通常使用编码来实现漂亮的多语言URL。

请参见link的示例:

URL仅允许一定集合的英文字母字符,其中包括数字、破折号、斜杠和问号。所有其他字符都必须进行编码,这适用于非拉丁语域名。如果您转到 فنادق.com,您会注意到一些浏览器将对其进行解码并显示 فنادق.com,但像Chrome这样的浏览器将向您显示类似于 http://www.xn--mgbq6cgr.com/ 的内容。

这意味着您不能再过滤您的文章标题并仅允许url有效字符,您需要对标题进行编码,并希望浏览器能够按照您的要求呈现它们。

另一个选择是使用音译,可能在检测到已知无法呈现URL编码特殊字符的浏览器后使用。

我认为我的Web服务器或mod_rewrite不是问题所在,我相信是我正在使用的PHP函数将URL转换为SEO友好的URL。如果我手动复制阿拉伯文本并将其放入URL中,它就可以正常工作。我只需要知道如何通过PHP将字符串转换为SEO友好的URL,无论它是什么语言。另外,我正在运行Apache。 - John
那么我认为我们需要更多关于您正在使用的PHP函数的信息,因为它可能存在与其他字符编码的问题。 - petr
好的,我刚刚发布了我的 PHP 函数。 - John
那么我该如何对字符串进行编码呢?如果我现在只是将脚本中的 '[^a-z0-9-_]' => '' 部分删除,它看起来会像这样:/listing/��������-��������-������������ - John
我发现另一个有趣的事情,mb_strtolower 只在指定 utf-8 字符串时才起作用。我以为默认情况下 mb 会处理 utf8。所以使用以下代码可以解决问题:$str = mb_strtolower($str,'UTF-8'); - John
显示剩余2条评论

0

我有一个网站,支持48种不同的语言。我用的清理URL的函数在这里(使用JavaScript编写),也许对你有帮助:

const noHyphenLangs = ['ko', 'ja', 'zh-cn', 'zh-tw', 'ar', 'th']
const formatTranslationIntoPath = (text, symbol) => { // utf-8 encoding
  let t = text
  const replaceChar = noHyphenLangs.includes(symbol) ? '' : '-'
  t = t.replace(/-/g, ' ')
  t = t.replace(/\s/g, replaceChar)
  t = t.replace(/['`’]/g, '') // remove quotes
  t = t.replace(/[,,()]/g, '') // remove junk
  t = t.normalize('NFD').replace(/\p{Diacritic}/gu, '') // simplify letters for url https://dev59.com/OnNA5IYBdhLWcg3wX8nk
  t = t.replace(/[Łł]/g, 'l') // doesn't get replaced in diacritic replacements

  return t.toLowerCase()
}

const ex1 = formatTranslationIntoPath('让我们  尝试-这样-做', 'zh-cn') // 让我们尝试这样做
const ex2 = formatTranslationIntoPath('Việt miễn phí', 'vi') // viet-mien-phi

注:对于大多数语言,如果没有可用的变音替换,您不希望删除非字母数字字符。

参考:https://gist.github.com/KevinDanikowski/24c79cbb7a3ef2a7f3e452e740848249


0

John,你说得对,主要问题是你的正则表达式字符类([^a-z0-9\-_])不允许UTF-8字符。这个应该更好用:[^\p{L}0-9\-_]

我最近一直在研究这样的函数,并刚刚发布了一个包含我想出来的函数的博客文章:使用url_slug()在PHP中创建SEO友好的URL


0

对我来说似乎起作用的是从我的PHP函数中删除此部分:

'[^a-z0-9\-_]'          => '',

将strtolower行更新为:

$str = mb_strtolower($str,'UTF-8');

看起来它正常工作。但是有人能确认这将在未来起作用吗?浏览器是否会理解所有语言的内容?还是我必须规范化字符串以确保每个浏览器都能理解URL?问题是我不在php 5.3上,这需要安装php的规范化扩展。如果我升级,我担心会破坏一些东西,我目前使用的是5.2x。


关于它的前向工作 - 请看一下我的帖子,我在那里谈论浏览器。要想100%兼容的唯一方法是使用转译或检测浏览器并重定向。请参见最后两个。 - petr
@petr 我找到了这个,https://github.com/jbroadway/urlify。它来自这篇文章,https://dev59.com/knM_5IYBdhLWcg3wp0-l。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接