3

我有一个使用 php 构建的网站,该网站将允许多语言的内容。该网站的一部分将有企业列表。我设置了 SEO 友好的 url 来查看这些列表,例如,我会有一个名为“A bar down the street”的商家列表。网址如下所示:

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

但是,假设此列表有阿拉伯语版本,则名称将如下所示:

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

我如何将其制作成与英文版相同的 url 格式,但使用它当前使用的语言?当我在阿拉伯语版本上尝试将字符串转换为 seo 友好 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));

    }
4

4 回答 4

1

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

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

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

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

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

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

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

请参阅链接中的示例:

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

这意味着您不能再过滤您的帖子标题而只允许 url-valid 字符,您需要对标题进行编码并希望浏览器按照您的意愿呈现它们。

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

于 2012-05-14T16:04:47.427 回答
0

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

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

并将 strtolower 行更新为:

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

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

于 2012-05-14T18:35:19.877 回答
0

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

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

于 2012-07-13T20:04:49.553 回答
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

于 2021-06-23T14:38:48.107 回答