2011-05-29 45 views
3

接受语言输出变量HTTP_ACCEPT输出的是一个烂摊子,我不能使用它,需要转变成一个这样的数组:变换的阵列

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

我希望你们能帮助我。

编辑:

这里是将检测客户端的首选语言代码,这是一个快速的方法来猜测用户的语言:

我做这个想法的所有西班牙语和葡萄牙语的访问者,中间有一些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); 
?> 
+0

什么乱七八糟你得到的输出? – 2011-05-29 15:23:21

+0

en-US,en; q = 0.8,pt-PT; q = 0.6 012,我相信数字结果是根据我浏览的PT或EN页面的百分比来计算的。我需要这个作为一个数组,所以我可以定义一些条件。 – Souza 2011-05-29 15:31:34

+0

@ Coding-Freak,对我有什么提示?非常感谢你! – Souza 2011-05-29 15:54:46

回答

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

编辑答案来解释一种方法。 – Aif 2011-05-29 18:04:04

+0

非常感谢您的回答,我修改了您的代码,使其可以像所有浏览器一样工作。检查我的问题编辑,并再次,非常感谢你。 PS:请看我的改动是否做得很好。 – Souza 2011-05-30 03:05:25