Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Wyrażenia regularne - zapisywanie do tablicy podciągów pasujących do wzorca
ZaqU
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 21.01.2013

Ostrzeżenie: (0%)
-----


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

Ten post edytował ZaqU 21.04.2014, 11:00:21
Go to the top of the page
+Quote Post
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ZaqU
post
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 21.01.2013

Ostrzeżenie: (0%)
-----


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

Ten post edytował ZaqU 21.04.2014, 11:00:49
Go to the top of the page
+Quote Post
ZaXaZ
post
Post #4





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

Ostrzeżenie: (0%)
-----


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

Ten post edytował ZaXaZ 21.04.2014, 11:30:30


--------------------
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://www.mpopp.net/2010/08/how-to-do-use...zend-framework/


--------------------
Go to the top of the page
+Quote Post
ZaqU
post
Post #6





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 21.01.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
by_ikar
post
Post #7





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 07:46