Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    [IE8 e HTTP_USER_AGENT] qualche sorpresina...

    Ciao a tutti.

    Volevo informarvi di un piccolo problema che si potrebbe presentare a coloro che avessero necessità di fare un controllo tramite $_SERVER['HTTP_USER_AGENT'] ed incappasero nel nuovo internet explorer 8.

    Sul mio sito avevo deciso di fare un piccolo "warning" destinato agli utilizzatori del famigerato IE6 per chiedere loro di considerere un upgrade ad una versione più recente.
    Mi è piaciuto quello di google: http://code.google.com/p/ie6-upgrade-warning/

    l'ho quindi montato in un semplicissimo javascript che appariva se il controllo qui sotto dava buon esito:
    Codice PHP:
    if(ereg("MSIE (5.5|6)"$_SERVER['HTTP_USER_AGENT']))
    {
    // mostra il warning

    Funzionava perfettamente, sino a quando su una macchina non ho fatto l'upgrade da IE7 a IE8 e provando a caricare la pagina mi apriva il warning

    La colpa è della versione 8 di IE, che a seconda della macchina su cui si trova può generare stringhe di User Agent particolarmente antipatiche:
    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322)
    che ovviamente vedendo in mezzo a tutto anche "MSIE 6.0" fanno scattare il meccanismo

    Ho risolto con questo doppio controllo, ossia:
    verifica che sia presente "MSIE 6" e se contemporaneamente NON trova alcuna stringa tra MSIE e MSIE 6 (cioè non è presente due volte il termine "MSIE"), allora vuol dire che non siamo di fronte ad uno user agent IE8, ma piuttosto ad un browser IE6!

    Codice PHP:
    if(ereg("MSIE (5.5|6)"$_SERVER['HTTP_USER_AGENT']) && !ereg("MSIE.*MSIE 6"$_SERVER['HTTP_USER_AGENT']))
    {
    // mostra il warning

    Spero che vi possa essere di aiuto.



    Stefano

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    E' la legge di Murphysoft.

    Se c'è un modo per complicare le cose, Bill lo troverà

  3. #3
    E anche il php.

    Le ereg sono deprecate e con il php 3.0 da quel che ho visto non vanno piu'.

    http://cvs.php.net/viewvc.cgi/php-sr...athrev=PHP_5_3

    cercare deprecated per vederle tutte ....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Originariamente inviato da piero.mac
    E anche il php.

    Le ereg sono deprecate e con il php 3.0 da quel che ho visto non vanno piu'.

    http://cvs.php.net/viewvc.cgi/php-sr...athrev=PHP_5_3

    cercare deprecated per vederle tutte ....
    Non lo sapevo.
    Direi che per un po' sono a posto: il mio provider ha appena fatto l'upgrade a php 4.3.9

    ciao ,
    stefano

  5. #5
    mmm più che altro direi di fare anche un altro tipo di controllo

    una bella preg_match in questo caso risolverebbe il problema

    www.php.net/preg_match

    estrapoli il primo con una regexp tipo /MSIE (\d)\.(\d)/i (non l'ho minimamente provata) e poi verifichi con i valori ritornati cosa contiene il primo ed il secondo elemento

    è sicuramente leggermente più complesso perché richiede qualche carattere in più però non corri alcun tipo di rischio

  6. #6
    Originariamente inviato da daniele_dll
    mmm più che altro direi di fare anche un altro tipo di controllo

    una bella preg_match in questo caso risolverebbe il problema

    www.php.net/preg_match

    estrapoli il primo con una regexp tipo /MSIE (\d)\.(\d)/i (non l'ho minimamente provata) e poi verifichi con i valori ritornati cosa contiene il primo ed il secondo elemento

    è sicuramente leggermente più complesso perché richiede qualche carattere in più però non corri alcun tipo di rischio
    Eccomi qua, ciao !

    Allora grazie a piero.mac x l'osservazione e a daniele_dll per avermi suggerito l'uso delle regxp PERL compatibili. Mi è risultata subito ottimale preg_match_ALL, che ha proprio quello che stavo cercando: un bel contatore di match !.

    L'espressione FUNZIONANTE, è quindi diventata:

    Codice PHP:
    $test $_SERVER['HTTP_USER_AGENT'];

    if (
    preg_match ("/\bMSIE (5|6)\b/"$test) && preg_match_all("/\bMSIE\b/"$test$matchPREG_SET_ORDER)===1)
          {
    // avvia warning} 
    In pratica (e in italiano): se nella stringa HTTP_USER_AGENT rilevo MSIE 5 o MSIE 6

    ....e

    la stringa MSIE è ripetuta una sola volta,

    ==> allora vuol dire che siamo di fronte ad un vero Internet Explorer 5.x o 6.x (accidenti a lui)


    e grazie ancora dello spunto.

    Stefano

  7. #7
    mmm tecnicamente ti basterebbe tirare fuori solo il primo MSIE (\d\).(\d) e verificare i due valori perché comunque è il primo quello importante

    il secondo spunta fuori perché il browser lavora in modalità compatibile

    ma se lavora in modalità compatibile tu non dovresti avere preoccupazioni

  8. #8
    Originariamente inviato da daniele_dll
    mmm tecnicamente ti basterebbe tirare fuori solo il primo MSIE (\d\).(\d) e verificare i due valori perché comunque è il primo quello importante

    il secondo spunta fuori perché il browser lavora in modalità compatibile

    ma se lavora in modalità compatibile tu non dovresti avere preoccupazioni
    Si, in effetti ci avevo pensato, ma poi non ero riuscito a formalizzare un controllo di questo tipo; ho infatti qualche difficoltà ad interpretare i risultati del preg_match, specie dell'array opzionale

    Cosa suggeriresti ?

    ciao,
    stefano

  9. #9
    dopo che ti fai ritornare l'array

    var_dump($array);

  10. #10
    Originariamente inviato da daniele_dll
    dopo che ti fai ritornare l'array

    var_dump($array);
    D'accordo .
    ma come faccio a dirgli:

    - verifica il primo MSIE
    - se questo è l'unico match dell'useragent e se è 5|6
    --> allora attiva il warning.

    è qui che mi incaglio porca puzzola..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.