转换数组中的Accept-language输出

时间:2011-05-29 15:17:42

标签: php

变量http_accept输出很乱,我无法使用它,需要转换成这样的数组:

Array
(
    [en-ca] => 1
    [pt-pt] => 0.4
    [de] => 0.2
);

我希望你们能帮帮我。

编辑:

这是一个可以检测客户端首选语言的代码,这是一种猜测用户语言的快捷方法:

我已经考虑过所有西班牙和葡萄牙访问者,在midle中有一些substr,因为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);
?>

1 个答案:

答案 0 :(得分:7)

看起来喜欢this是你的答案:)

尝试解释一种算法:(仅针对您的样本进行测试)

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

请注意,每个lang用逗号,分隔,对于某种语言,您有一个首选顺序(浮动内容)。

首先,获取逗号内的值:

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

然后对于每个值,如果有;,则检索左手键的值并将其存储在数组中; otherwize,将lang存储为键,并将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);