Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenia regularne - zapisywanie do tablicy podciągów pasujących do wzorca
Forum PHP.pl > Forum > Przedszkole
ZaqU
Witam,

Od ponad godziny głowię się nad wykrywaniem języka przeglądarki. Korzystam z $_SERVER['HTTP_ACCEPT_LANGUAGE'], która to zwraca mi takie coś:
Kod
pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4

To co mnie interesuje, to wyciągnięcie z tego ciągu pl-PL, a w drugiej kolejności en-US. Muszę zatem użyć wyrażeń regularnych, ale nie mam zielonego pojęcia w jaki sposób mógłbym zapisać do tablicy podciągi pasujące do wzorca. Przeszukałem całą dokumentację preg_* na php.net, ale nie znalazłem niczego co by mi pomogło (może coś przeoczyłem? w końcu już dawno po północy).

To czym dysponuje to sam wzorzec:
Kod
/[a-z]{2}\-[A-Z]{2}/

Ale potrzebuję do tego jeszcze tylko funkcji - wystarczy mi sama nazwa. smile.gif
by_ikar
W dokumentacji preg_* tego nie znajdziesz, bo jest to tylko implementacja regexpa. O regexpie musisz poczytać gdzieś indziej, bo za wiele o tym nie przeczytasz w manualu. Można to zrobić przykładowo tak:

  1. <?php
  2.  
  3. $v = 'pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4';
  4.  
  5. preg_match_all('#([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?#i', $v, $matches);
  6.  
  7. echo '<pre>'.print_r($matches, true).'</pre>';
  8.  
  9. if(in_array('pl-PL', $matches[1]))
  10. {
  11. //do something
  12. } elseif(in_array('en-US', $matches[1]))
  13. {
  14. //do something
  15. }


ps wykrywanie języka polecam wykonać tylko raz a informację o tym zapisać do cookie/sesji etc.
ZaqU
Dzięki wielkie, działa! smile.gif

PS. W pierwszym poście wkradł się błąd, zamiast $_SESSION['HTTP_ACCEPT_LANGUAGE'] miało być $_SERVER['HTTP_ACCEPT_LANGUAGE'] tongue.gif
ZaXaZ
mi działa tak do twojego przykładu:

  1. <?php
  2. $string = 'pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4';
  3. $explode = explode(',', $string);
  4. $first = $explode[0];
  5. $second = substr($explode[2],0,5);
  6. echo 'Lang 1: '.$first.'<br/>';
  7. echo 'Lang 2: '.$second;
  8. ?>


nie wiem jak do innych.

--EDIT--
Nie polecam mojego rozwiązania tongue.gif moja przeglądarka jak zrobiłem echo tamtej zmiennej $_SERVER... i print_r($explode);

wyświetla tak:

Kod
pl,en;q=0.9

Array ( [0] => pl [1] => en;q=0.9 )
Lang 1: pl
Lang 2:


--EDIT--
@2x down,
ja testowałem na telefonie,
Opera Mobile 12.10,
android 2.3.6
ZaqU
Prawda jest taka, że na każdej przeglądarce działa to inaczej. Przykłady i założenia z pierwszego postu pochodziły z Chrome'a, ale testowałem to też na FF, Operze oraz IE. Wyniki były takie, że na jednych przeglądarkach mamy w ciągu pl-PL, w innym pl-pl, w jeszcze innym samo pl.
by_ikar
Cytat(ZaqU @ 21.04.2014, 12:27:15 ) *
Prawda jest taka, że na każdej przeglądarce działa to inaczej. Przykłady i założenia z pierwszego postu pochodziły z Chrome'a, ale testowałem to też na FF, Operze oraz IE. Wyniki były takie, że na jednych przeglądarkach mamy w ciągu pl-PL, w innym pl-pl, w jeszcze innym samo pl.


W "in_array" możesz jako argument podać tablicę z argumentami, dzięki czemu tych porównań może być kilka:

  1. <?php
  2.  
  3. $v = 'pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4';
  4.  
  5. preg_match_all('#([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?#i', $v, $matches);
  6.  
  7. echo '<pre>'.print_r($matches, true).'</pre>';
  8.  
  9. if(in_array(array('pl-PL', 'pl'), $matches[1]))
  10. {
  11. //do something
  12. } elseif(in_array(array('en-US', 'en'), $matches[1]))
  13. {
  14. //do something
  15. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.