Just nu i M3-nätverket
Jump to content

RegExp för att kolla webbläsare -


Pontus östlund

Recommended Posts

Pontus östlund

Okej, jag har försökt pilla ihop mitt allra första RegExp och det funkar NÄSTAN som det ska, men givetvis inte helt och fullt. Funktionen kollar (ska kolla) om det är en webbläsare som har lägre versionsnummer än 4!

 

Såhär ser funktionen ut:

 

function isDom($browser){
   $notDom = preg_match('#(.*)(\/[0-4])(.*?)([^MSIE [0-4]])#i',$browser);
   if ($notDom == true) {
      $DOM = false;
   }else{
      $DOM = true;
   }
   return $DOM;
}

Anropet:

$browser = getenv('HTTP_USER_AGENT');
echo $browser."<br>";
$DOM = isDom($browser);
$old = ($DOM == false) ? "Not DOM-compatible" : "DOM-compatible";
echo $old;

Och detta får jag till svar

 

Mozilla/4.79 (Macintosh; U; PPC)

DOM-compatible *Fel*

 

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

DOM-compatible

 

Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [sv]

Not DOM-compatible *Fel*

 

Mozilla/4.76 [en] (Windows NT 5.0; U)

Not DOM-compatible

 

Opera/6.0 (Windows 2000; U) [sv]

DOM-compatible

 

Mozilla/4.76 (Windows 2000; U) Opera 6.0 [sv]

Not DOM-compatible

 

Mozilla/5.0 (Windows 2000; U) Opera 6.0 [sv]

DOM-compatible

 

Mozilla/3.0 (Windows 2000; U) Opera 6.0 [sv]

Not DOM-compatible

 

Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826

DOM-compatible

 

Varför är det fel på Mac:en men inte Windows för NS, och varför funkar riktiga IE men inte Opera inställd som IE!

 

Som sagt var; detta är mitt första försök till att göra ett regexp så garva inte ;)

# ==============================extra===

# Nordens största F l a s h community

# www.communen.com | poppa@communen.com

 

[inlägget ändrat 2002-08-31 14:49:30 av Pontus östlund]

Link to comment
Share on other sites

Jag förstår inte riktigt hur du har tänkt dig regexpen från början, den känns helskum. Om du kan beskriva vad du tänkte kolla med regexpen ovan ska jag gärna hjälpa dig med en regexp som borde fungera :-)

 

Red: Rent allmänt tycker jag föresten att du gör det för enkelt för dig, du kan aldrig avgöra med en enkel matchning om browsern är dom-kompatibel eller inte, du måste hämta ut någon av de grupperna som utgör delar av user-agent-strängen. Eftersom du har en massa parenteser i regexpen misstänker jag att du tänkt göra det (annars är parenteserna rätt meningslösa).

[inlägget ändrat 2002-09-01 21:41:24 av fhe]

Red2: Stabfel :-)

[inlägget ändrat 2002-09-01 21:52:42 av fhe]

Link to comment
Share on other sites

Pontus östlund

Okej, jag går igenom det:

$notDom = preg_match('#(.*)(\/[0-4])(.*?)([^MSIE [0-4]])#i',$browser);

Det första kan man väl egentligen stryka (.*).

 

Efter det vill jag kolla vad det är för version. Detta dyker ju upp efter / (ex: Mozilla/5.0) Alltså, jag kollar om siffran efter / är mellan 0 och 4. Efter det kan olika tecken förekomma (.*) fram tills det att MSIE lägre än 5 INTE förekommer. Alltså, IE utger sig ju för att vara Mozilla i den första avdelningen och visar sitt rätta ansikte med (compatible; MSIE 6.0 t ex) Jag vill kolla att det INTE står MSIE 4 (och jag ser nu att det ju borde stå ^MSIE [5-9])!

 

D V S, webbläsarversionen får inte vara lägre än 5 och står det MSIE i webbläsarsträngen så måste den vara minst 5.

 

Hoppas det blev lite klarare!

# ==============================extra===

# Nordens största F l a s h community

# www.communen.com | poppa@communen.com

 

Link to comment
Share on other sites

Och (.*?) använder du för vadå?

 

Såhär är det iaf, du har fattat ^ rätt när du använder det som ett "inte" i settet med MSIE, däremot så har du inte riktigt förstått hur [] fungerar. [^MSIE] betyder "ett tecken som inte är M, S, I eller E".

 

Jag förstår inte riktigt hur du får "Opera/6.0 (Windows 2000; U) [sv]" att matcha eftersom den som jag ser det inte uppfyller det andra vilkoret med en "\/[0-4]", men det hör inte hit.

 

Jag tycker du ska byta spår, Leta efter kännetecken på Opera (om du nu vill släppa in eländet) när den presenterar sig som ovan, kolla därefter vilken Mozilla som browsern hävdar att den är (det görs enklast med en "/Mozilla\/([0-9]+[\.]*[0-9]*)/" (därefter kan du kolla vad du fick i grupp 1, det borde vara nånting som går utsökt att räkna med (4.79, 5.0 eller motsv).

Om du tycker att Moz4.0 är ok endast om du har MSIE >= 5.0 så kan du leta efter en MSIE-version på samma sätt som du letade efter Mozilla-versionen.

 

Om du mot förmodan skulle lyckas sätta ihop det till EN regexp så kan jag bara gratulera dig, det kommer att fungera tills någon släpper nästa version av nåt (och då kommer du att få ett litet h-vete att få det att funka igen :-).

 

Jag har knappt hackat nån php alls men jag har fått för mig att nedanstående är lite av standard:

http://www.zend.com/manual/function.get-browser.php

 

Om det är det så borde du inte behöva göra nåt alls.

 

[inlägget ändrat 2002-09-01 23:33:08 av fhe]

Link to comment
Share on other sites

Pontus östlund

Jo jag överväger att köra get_browser(), grejen var bara den att jag nu hade hittat ett skarpt läge att lära mig lite RegExp. Men nu har jag redan bestämt mig för att köra get_browser(), så jag får lära mig RegExp vid ett senare tillfälle ;)

 

Tack för att du tog dig tid! Det är inte plättlätt med RegExp.

 

( Såhär der det det ut nu

$browser = get_browser()

if($browser->majorver > 4) echo "Okej då";

else echo "Njae";

 

typ!)

# ==============================extra===

# Nordens största F l a s h community

# www.communen.com | poppa@communen.com

 

[inlägget ändrat 2002-09-01 23:36:38 av Pontus östlund]

Link to comment
Share on other sites

Pontus östlund

Tackar, men nu har jag redan fixat det. Grejen är att jag egentligen vill veta om det är en DOM-läsare eller inte! Detta går ju inte att ta reda på med PHP och saken är den att jag inte kan använda JS till detta eftersom att det är PHP som måste veta det.

 

Jag skriver ut en css-klass i en IMG-tagg och transparenta .png och detta ogillas å det grövsta av t ex NS4, och det samma gäller även IE4 kan jag tänka, och därför skriver jag ut text istället för .png och img-taggar utan css för webbläsare från 1900-talet!

 

Mend et funkar tillfredställande med den lösningen jag har nu.

 

Tack ska ni ha så mycket. :)

# ==============================extra===

# Nordens största F l a s h community

# www.communen.com | poppa@communen.com

 

Link to comment
Share on other sites

Du kan ju göra så att du kolla med hjälp av ett JavaSkript om läsaren är DOM-kompatibel elelr ej, och sedan skickar vidare användaren till en annan adress:

 

<script>
// --- Kolla om DOM-kompatibel ---
// Kod för detta finns säkerligen på någon Javaskriptssida
if (domkomp) top.location = "skript.php?dom=1";
else top.location = "skript.php?dom=0";
</script>

 

Sedan kan du ju starta en PHP-session som sparar om webbläsaren är DOM-kompatibel eller ej.

 

Jag brukar göra på detta sätt för att kolla om en användare har Flash eller ej installerat.

 

Link to comment
Share on other sites

Pontus östlund

Alltså, skillnaden är så liten mellan sidorna att det vore idiotiskt dumt att göra två versioner. Vet jag att webbläsaren är nyare än version 4 så antar jag att den hanterar css-klasser i img-taggen. Det är inte så att sidan ser konstig ut utan dessa extra attribut bara lite snyggare med dem ;)

 

Alltså redirection är uteslutet och den lösning som nu är (eller kommer i morgon) funkar finfint :)

 

Sidan det gäller finns på

http://ksm.ituf.liu.se

 

Kolla med NS4 på Mac (mitt icke-fullt-fungerande regexp ligger fortfarande uppe) så ballar sidan ut fullständigt. På Win ser det däremot bra ut även på NS4. Som sagt var; get_browser() duger fint :)

 

# ==============================extra===

# Nordens största F l a s h community

# www.communen.com | poppa@communen.com

 

Link to comment
Share on other sites

Jag har knappt hackat nån php alls men jag har fått för mig att nedanstående är lite av standard:

http://www.zend.com/manual/function.get-browser.php

 

Standard? Nää skulle inte tro det. get_browser fungerar endast om man har laddat ner och "installerat" browscap.ini, vilket sedan måste uppdateras i takt med att nya browsers kommer ut.

 

Det är långifrån alla webbhotell som har browscap.ini installerat. Som vanlig användare kan man inte installera den, då man måste referera till den från php.ini.

 

Så, om man inte har en webbserver med möjlighet att få browscap.ini installerat återstår bara att använda sig av $HTTP_USER_AGENT. Sedan får man försöka klura ut hur man utifrån strängar som tex

 

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MSN 6.1; MSNbMSFT; MSNmen-us; MSNc11)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; YComp 5.0.0.0; yplus 1.0)

ska få fram browser, version, OS.

 

Jag letar faktiskt också efter ett sådant script, färdigt, så om det är någon som har en idé eller tips så skulle jag uppskata det. :)

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

[inlägget ändrat 2002-09-04 05:02:10 av TicoRoman (Almir)]

Link to comment
Share on other sites

Fredrik Stark

Detta skript använder jag för att kolla browser. Funkar alldeles förträffligt. Är det IE och minst v4 så sätts $IE till 1. Annars är det någon annan.

Det är ju rätt lätt att modifiera den efter sina behov.

 

$VER = intval(trim(substr($HTTP_USER_AGENT, 4 + strpos($HTTP_USER_AGENT, "MSIE"), 2)));

$IE = eregi("MSIE",$HTTP_USER_AGENT) && ($VER >= 4) == 1;

 

if ($IE == 1)

// internet explorer

else

netscape eller annat

 

Link to comment
Share on other sites

Hej igen!

 

Har kollat på de färdiga skripten, men ingen av de detekterade Mozilla och Netscape 7 rätt. Efter några mindre ändringar har jag fått fram ett fungerande skript som detekterar alla versioner av IE, NS, Opera samt några andra.

 

Skriptet detekterar även OS, tex Windows, Linux, *BSD, Unix osv...

 

<?php

$useragent = $HTTP_USER_AGENT;

// Browser
if(eregi("(opera) ([0-9]{1,2}.[0-9]{1,3}){0,1}",$useragent,$match) || eregi("(opera/)([0-9]{1,2}.[0-9]{1,3}){0,1}",$useragent,$match))
{
$BName = "Opera"; $BVersion=$match[2];
}
elseif(eregi("(konqueror)/([0-9]{1,2}.[0-9]{1,3})",$useragent,$match))
{
$BName = "Konqueror"; $BVersion=$match[2];
}
elseif(eregi("(lynx)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$useragent,$match))
{
$BName = "Lynx "; $BVersion=$match[2];
}
elseif(eregi("(links) \(([0-9]{1,2}.[0-9]{1,3})",$useragent,$match))
{
$BName = "Links "; $BVersion=$match[2];
}
elseif(eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})",$useragent,$match))
{
$BName = "Internet Explorer "; $BVersion=$match[2];
}
elseif(eregi("(netscape6)/(6.[0-9]{1,3})",$useragent,$match))
{
$BName = "Netscape "; $BVersion=$match[2];
}

//Här följer ändringar för att detektera Netscape 7.x, Mozilla 0.x och Mozilla 1.x rätt.

elseif(eregi("(netscape)/(7.[0-9]{1,3})",$useragent,$match))
{
$BName = "Netscape "; $BVersion=$match[2];
}

elseif(eregi("(rv):(0.[0-9]{1,3}.[0-9]{1,3})",$useragent,$match))
{
$BName = "Mozilla "; $BVersion=$match[2];
}

elseif(eregi("(rv):(1.[0-9]{1,3})",$useragent,$match))
{
$BName = "Mozilla "; $BVersion=$match[2];
}

elseif(eregi("mozilla/5",$useragent))
{
$BName = "Netscape"; $BVersion="Unknown";
}

//Slut på ändringar

elseif(eregi("(mozilla)/([0-9]{1,2}.[0-9]{1,3})",$useragent,$match))
{
$BName = "Netscape "; $BVersion=$match[2];
}
elseif(eregi("w3m",$useragent))
{
$BName = "w3m"; $BVersion="Unknown";
}
else{$BName = "Unknown"; $BVersion="Unknown";}

// System
if(eregi("linux",$useragent))
{
$BPlatform = "Linux";
}
elseif(eregi("win32",$useragent))
{
$BPlatform = "Windows";
}
elseif((eregi("(win)([0-9]{2})",$useragent,$match)) || (eregi("(windows) ([0-9]{2})",$useragent,$match)))
{
$BPlatform = "Windows $match[2]";
}
elseif(eregi("(winnt)([0-9]{1,2}.[0-9]{1,2}){0,1}",$useragent,$match))
{
$BPlatform = "Windows NT $match[2]";
}
elseif(eregi("(windows nt)( ){0,1}([0-9]{1,2}.[0-9]{1,2}){0,1}",$useragent,$match))
{
$BPlatform = "Windows NT $match[3]";
}
elseif(eregi("mac",$useragent))
{
$BPlatform = "Macintosh";
}
elseif(eregi("(sunos) ([0-9]{1,2}.[0-9]{1,2}){0,1}",$useragent,$match))
{
$BPlatform = "SunOS $match[2]";
}
elseif(eregi("(beos) r([0-9]{1,2}.[0-9]{1,2}){0,1}",$useragent,$match))
{
$BPlatform = "BeOS $match[2]";
}
elseif(eregi("freebsd",$useragent))
{
$BPlatform = "FreeBSD";
}
elseif(eregi("openbsd",$useragent))
{
$BPlatform = "OpenBSD";
}
elseif(eregi("irix",$useragent))
{
$BPlatform = "IRIX";
}
elseif(eregi("os/2",$useragent))
{
$BPlatform = "OS/2";
}
elseif(eregi("plan9",$useragent))
{
$BPlatform = "Plan9";
}
elseif(eregi("unix",$useragent) || eregi("hp-ux",$useragent))
{
$BPlatform = "Unix";
}
elseif(eregi("osf",$useragent))
{
$BPlatform = "OSF";
}
else{$BPlatform = "Unknown";}


echo "Browser:".$BName."<p>";
echo "Version:".$BVersion."<p>";
echo "Operativsystem:".$BPlatform;

?>

 

Observera att Windows NT 5.0 är Windows 2000, och Windows NT 5.1 är Windows XP.

 

 

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

 

[inlägget ändrat 2002-09-07 04:12:06 av TicoRoman (Almir)]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...