Преобразование Accept-вывод языка в массив

#php

#php

Вопрос:

Вывод переменной 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);
?>
  

Комментарии:

1. Что за беспорядок вы получаете на выходе?

2. ru-US, en; q = 0,8, pt-PTT; q = 0,6 Я полагаю, что результаты по количеству рассчитываются на основе процента страниц PT или EN, которые я просматриваю. Мне нужно, чтобы это было в виде массива, чтобы я мог определить некоторые условия.

3. @Coding-Freak , есть какая-нибудь подсказка для меня? Большое вам спасибо!

4. Ответ был опубликован «АиФ». Надеюсь, вы видели ссылку. thefutureoftheweb.com/blog/use-accept-language-header

Ответ №1:

Похоже, это ваш ответ 🙂

Попытка объяснить один алгоритм: (протестирован только с вашим образцом)

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

Обратите внимание, что каждый язык разделяется запятой , , и для некоторого языка у вас есть порядок предпочтений (значение с плавающей запятой).

Сначала получите значения внутри запятых:

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

Затем для каждого значения, если есть ; , извлеките значение для левого ключа и сохраните его в массиве; в противном случае сохраните 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);
  

Комментарии:

1. Большое вам спасибо за ваш ответ, я изменил ваш код, чтобы он работал так, как я хочу, со всеми браузерами. Проверьте отредактированный мой вопрос и еще раз, большое вам спасибо. PS: Пожалуйста, посмотрите, хорошо ли сделаны мои изменения.