将Accept-language输出转换为数组

3
变量 http_accept 的输出很混乱,我无法使用它,需要将其转换为如下的数组格式:
Array
(
    [en-ca] => 1
    [pt-pt] => 0.4
    [de] => 0.2
);

我希望你们能帮我,以下是需要翻译的内容:

编辑:

这里有一段代码,可以检测客户端首选语言,这是一种快速猜测用户语言的方式:

我为所有西班牙语和葡萄牙语访问者考虑到了这一点,中间有一些子字符串,因为 pt-BR 或 pt-PT 将使用相同的语言文件,例如 es-ES 和 es-CO。

<?php
// detectar idioma
$linguagens = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$parcelas = explode(',', $linguagens);
$linguas_aceites = array();

foreach ($parcelas as $lingua) {
        $contagem = preg_match('/([-a-zA-Z]+)\s*;\s*q=([0-9\.]+)/', $lingua, $matches);
        if ($contagem === 0)
           $linguas_aceites[substr($lingua, 0, 2)] = 1;
        else
           $linguas_aceites[substr($matches[1], 0, 2)] = $matches[2];
}

foreach ($linguas_aceites as $key => $val) { 
      if(substr($key, 0, 2) == "pt"){
        echo "Portugues e preferido aqui";}
}   

?>

这不可能没有Aif的帮助(非常感谢原始代码!):
<?php

    $al = 'en-US,en;q=0.8,pt-PT;q=0.6';
    $values = explode(',', $al);

    $accept_language = array();

    foreach ($values AS $lang) {
            $cnt = preg_match('/([-a-zA-Z]+)\s*;\s*q=([0-9\.]+)/', $lang, $matches);
            if ($cnt === 0)
               $accept_language[$lang] = 1;
            else
               $accept_language[$matches[1]] = $matches[2];
    }

    print_r($accept_language);
?>

你得到的输出信息是什么混乱的东西? - Sujit Agarwal
我认为数字结果是基于我浏览的PT或EN页面百分比计算的。我需要将其作为数组,以便我可以定义一些条件。 - Souza
@Coding-Freak,你能给我一些提示吗?非常感谢! - Souza
答案已由aif发布。希望您已经看到了链接。http://www.thefutureoftheweb.com/blog/use-accept-language-header - Sujit Agarwal
1个回答

7

看起来这就是你的答案:这里

尝试解释一个算法:(仅在您的示例中进行了测试)

// Get the accept-language header
$al = 'en-US,en;q=0.8,pt-PT;q=0.6'

请注意,每种语言之间用逗号 , 分隔,并且对于某些语言,您可以设置偏好顺序(float 值)。

首先,获取逗号内的值:

$values = explode(',', $al);

对于每个值,如果有一个;,则检索左侧键的值并将其存储在数组中;否则,将语言作为键存储,并将1作为值。我使用preg_match返回匹配项的数量(如果没有则返回0,在我们的情况下是第一个)。

foreach ($values AS $lang) {
       $cnt = preg_match('/([-a-zA-Z]+)\s*;\s*q=([0-9\.]+)/', $lang, $matches);
       if ($cnt === 0)
           $accept_language[$lang] = 1;
       else
           $accept_language[$matches[1]] = $matches[2];
}

整个脚本:
<?php

$al = 'en-US,en;q=0.8,pt-PT;q=0.6';
$values = explode(',', $al);

$accept_language = array();

foreach ($values AS $lang) {
        $cnt = preg_match('/([-a-zA-Z]+)\s*;\s*q=([0-9\.]+)/', $lang, $matches);
        if ($cnt === 0)
           $accept_language[$lang] = 1;
        else
           $accept_language[$matches[1]] = $matches[2];
}

print_r($accept_language);

非常感谢您的回答,我已经修改了您的代码以满足我的需求,并且在所有浏览器上都可以正常工作。请查看我编辑后的问题,再次感谢您。 PS:请检查一下我的修改是否正确。 - Souza

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