多语言网站的SEO友好网址

时间:2012-05-14 15:58:17

标签: php multilingual seo

我有一个网站,我正在使用php构建,允许多语言的内容。该网站的一部分将有商家信息。我有SEO友好的网址设置来查看这些列表,所以例如我会有一个名为“街上的酒吧”的商家列表。网址看起来像这样:

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

但是,假设这个列表有阿拉伯语版本,那么名称将如下所示:

شريطأسفلالشارع

我如何将其制作成与英文版相同的网址格式,但是使用的语言是什么?当我在阿拉伯语版本上尝试我的函数时,将一个字符串转换为一个友好的URL,它就会变回空白。

修改 为了进一步澄清,我正在寻找的是一个php函数,它允许我将任何字符串转换为SEO友好URL,无论该网站使用何种语言。

编辑第2部分 下面是我用来将字符串重写为SEO友好网址的函数。也许你可以告诉我我需要添加什么来使它语言友好?

    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));

    }

4 个答案:

答案 0 :(得分:1)

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

我建议您查看您的网络服务器配置,看看有什么问题,seo友好的英文网址和任何其他可编码网址的字符串之间应该没有区别。

你在运行什么网络服务器?

<强>更新 我看到你只接受字母数字字符:

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

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

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

请参阅link中的示例:

  

URL只允许使用一组英文字母字符,其中包括数字,短划线,斜线和问号。必须对所有其他字符进行编码,这适用于非拉丁语域名。如果你去فنادق.com,你会注意到有些浏览器会对它进行解码并向你展示فنادق.com。但有些像Chrome会向你显示这样的http://www.xn--mgbq6cgr.com/

这意味着您无法再过滤帖子标题,只允许使用网址有效的字符,您需要对标题进行编码,并希望浏览器按照您的意愿对其进行渲染。

另一个选择是使用trans-literation,可能是在检测到已知不呈现url编码的特殊字符的浏览器之后。

答案 1 :(得分:0)

所以对我来说似乎有用的是我的php函数的这一部分:

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

将strtolower行更新为:

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

它似乎正常工作。但是,任何人都可以确认这将会继续吗?浏览器是否会理解所有语言?或者我是否必须规范化字符串以确保每个浏览器都能理解该URL?问题是我不在php 5.3上,这是安装php的规范化扩展所必需的。如果我升级的话,我担心它会破坏,我目前正在使用5.2x。

答案 2 :(得分:0)

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

我最近一直在研究这样的功能,刚刚发布了一篇博文,内容包括我提出的功能:Creating SEO Friendly URLs in PHP with url_slug()

答案 3 :(得分: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://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
  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

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

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