变量http_accept输出是乱七八糟的,我无法使用它,需要转换成这样的数组:
Array
(
[en-ca] => 1
[pt-pt] => 0.4
[de] => 0.2
);
Run Code Online (Sandbox Code Playgroud)
我希望你们能帮助我.
编辑:
这是一个可以检测客户端首选语言的代码,这是一种猜测用户语言的快速方法:
我已经对所有西班牙和葡萄牙访问者进行了思考,在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";}
}
?>
Run Code Online (Sandbox Code Playgroud)
如果没有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);
?>
Run Code Online (Sandbox Code Playgroud)
看起来喜欢这是你的答案:)
尝试解释一种算法:(仅针对您的样本进行测试)
// Get the accept-language header
$al = 'en-US,en;q=0.8,pt-PT;q=0.6'
Run Code Online (Sandbox Code Playgroud)
请注意,每个lang都用逗号分隔,,对于某种语言,您有一个首选顺序(浮动内容).
首先,获取逗号内的值:
$values = explode(',', $al);
Run Code Online (Sandbox Code Playgroud)
然后对于每个值,如果有;,则检索左手键的值并将其存储在数组中; 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];
}
Run Code Online (Sandbox Code Playgroud)
整个脚本:
<?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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1856 次 |
| 最近记录: |