Jan: Regex für Opera Version

Hallo,

laut http://www.useragentstring.com/pages/Opera/, gibt es hauptsächlich zwei große Varianten, wie der USER_AGENT_STRING für Opera lauten kann. Einmal mit Version/123 oder einmal mit Opera 123 als Versionsangabe.

(Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14  
Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14  
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14)

Nun möchte ich das ganze mit einem Regex überprüfen, um sicherzustellen, dass auch die richtige Versionsnummer ausgelesen wird.

Benutzt, habe ich bisher das hier: preg_match('/('.$Browser.')[ \/]([\w]+)/', $UserAgent, $Version);, was bei allen Browsern bis auf Opera funktioniert hat. Von Regex hab ich eigentlich 0 Ahnung, habe versucht mir eben über Google ein eigenes Regex zu basteln, das beide Fälle oben abdeckt, aber es nicht hinbekommen:

preg_match('/Version|Opera.\d+/', $UserAgent, $Version);

Eigentlich ist es doch entweder Version, oder Opera,  gefolgt von einem beliebigem Zeichen (entweder Leerzeichen, oder Slash), gefolgt von einer unbestimmten Anzahl digits für die Version, oder?

Was mache ich falsch?

  1. Nun möchte ich das ganze mit einem Regex überprüfen, um sicherzustellen, dass auch die richtige Versionsnummer ausgelesen wird.

    Wozu musst du denn die Browser-Version kennen?
    Vielleicht gibt es eine bessere Lösung für dein Problem.

    Limit the use of User Agent String based Detection

    1. Nun möchte ich das ganze mit einem Regex überprüfen, um sicherzustellen, dass auch die richtige Versionsnummer ausgelesen wird.

      Wozu musst du denn die Browser-Version kennen?
      Vielleicht gibt es eine bessere Lösung für dein Problem.

      Limit the use of User Agent String based Detection

      Ich möchte einfach eine Meldung wie "Ihr Browser ist zu alt, bitte updaten Sie ihren Browser." anzeigen lassen können, wenn der benutzte Browser meiner Meinung nach zu alt ist. (Die Seite, an der ich bastel, benutzt eine Menge neuerer Sachen, die von alten Browsern nicht unterstützt werden. Ich möchte das ganze einfach so abfangen über die Versionsnummer).

      if($Version < 8 && $Browser === "MSIE") ...

      So hatte ich mir das vorgestellt.

      1. Ich möchte einfach eine Meldung wie "Ihr Browser ist zu alt, bitte updaten Sie ihren Browser." anzeigen lassen können, wenn der benutzte Browser meiner Meinung nach zu alt ist. (Die Seite, an der ich bastel, benutzt eine Menge neuerer Sachen, die von alten Browsern nicht unterstützt werden. Ich möchte das ganze einfach so abfangen über die Versionsnummer).

        Genau das ist einer von den Fällen, die ich meinte. Browserverzweigungen sind aus dem letzten Jahrhundert, inzwischen ist Feature-Detection state of the art. Hier ein paar nützliche Links zu dem Thema:

        https://developer.mozilla.org/en-US/docs/Browser_Detection_and_Cross_Browser_Support#Use_feature_oriented_object_detection

        http://modernizr.com/

        http://afarkas.github.io/webshim/demos/

        1. http://modernizr.com/

          http://afarkas.github.io/webshim/demos/

          Das mag zwar alles sein, jedoch möchte ich nicht wirkliche Browserweichen einbauen und dann mein CSS, JS Code und ähnliches für jeden Browser anpassen, sondern lediglich eine Meldung erscheinen lassen, die in etwa aussagt der User habe doch bitte seinen Browser zu updaten. Kommt diese Meldung kann er auf der Homepage sowieso nichts machen, da nichts angezeigt wird. Es geht also nur darum zu ermitteln, ob der Browser "outdated" ist.

          Hier ist übrigens ein Regex, mit dem ich es jetzt hinbekommen habe die Opera Version auszulesen:

          elseif(strpos($UserAgent,'Opera') !== false) {  
          			// Opera  
          			$Browser = 'Opera';  
          			preg_match('/\ (Version|Opera).\d+.\d+/', $UserAgent, $Version);  
          			preg_match('/\d+.\d+/',$Version[0],$Version);  
                         $Version = intval($Version[0]);  
          		}
          

          Sieht zwar alles andere als schön aus, aber funktioniert. Wenn jemand eine bessere Idee für das Regex hat (ich kenn mich wirklich nicht damit aus), immer her damit.

          (Und trotzdem danke für die beiden Links, ich lese Sie mir gerade durch und kann sie vllt. im nächsten Projekt benutzen).

          1. Hallo,

            Das mag zwar alles sein, jedoch möchte ich nicht wirkliche Browserweichen einbauen und dann mein CSS, JS Code und ähnliches für jeden Browser anpassen, sondern lediglich eine Meldung erscheinen lassen, die in etwa aussagt der User habe doch bitte seinen Browser zu updaten. Kommt diese Meldung kann er auf der Homepage sowieso nichts machen, da nichts angezeigt wird.

            das kann ich zwar nicht gutheißen, aber wenn du meinst, das sei so in Ordnung ...

            Es geht also nur darum zu ermitteln, ob der Browser "outdated" ist.

            Ja gut - trotzdem: Dann such dir eins der neuesten der von dir benutzten Features raus (oder auch zwei oder drei) und teste, ob dieses Feature verfügbar ist. Falls ja, gut; falls nein, dann halt nicht. Das wäre dann immer noch unabhängig von der Browserversion, und du müsstest dir nicht einmal die Mühe machen und recherchieren, welche Version du bei welchem Browser mindestens voraussetzen musst.

            Ciao,
             Martin

            --
            Verliebt:    Er spricht, sie lauscht.
            Verlobt:     Sie spricht, er lauscht.
            Verheiratet: Beide sprechen, und die Nachbarn lauschen.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          2. Moin!

            Das mag zwar alles sein, jedoch möchte ich nicht wirkliche Browserweichen einbauen und dann mein CSS, JS Code und ähnliches für jeden Browser anpassen, sondern lediglich eine Meldung erscheinen lassen, die in etwa aussagt der User habe doch bitte seinen Browser zu updaten. Kommt diese Meldung kann er auf der Homepage sowieso nichts machen, da nichts angezeigt wird. Es geht also nur darum zu ermitteln, ob der Browser "outdated" ist.

            Es ist in der Regel peinlicher, wenn mir eine Seite anzeigt, mein Browser wäre zu alt (wurde erst letzte Woche aktualisiert auf die neueste Version), als wenn man dazu einfach geschwiegen hätte, und nichts getan. Bzw. einfach versucht, das zu tun, was man tun wollte.

            Auch die Pflege dieses Altershinweises will ja korrekt sein.

            Du darfst im Übrigen davon ausgehen, dass Opera-Browser, zusammen mit Firefoxen und Chromen, zu den am besten aktualisierten Browsern gehören.

            Und wenn das tatsächlich nicht der Fall ist, dann wird es daran liegen, dass der User nicht updaten KANN! Vermutlich, weil sein Admin ihn nicht lässt.

            - Sven Rautenberg

  2. @@Jan:

    nuqneH

    Was mache ich falsch?

    User agent sniffing.

    Für welche zweifelhafte Spielerei du das auch brauchen magst, ginge es vielleicht auch clientseitig? Operas haben in JavaScript ein spezielles window.opera-Objekt, in dem auch die Versionsnummer steckt.

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)