[PHP] Détecter le navigateur / bot en fonction du HTTP_USER_AGENT

Nouveau WRInaute
Bonjour à tous chers WRINautes,

je voulais partager avec vous une fonction PHP qui permet de détecter le navigateur (et pas la version) utilisé par un client en fonction de son HTTP_USER_AGENT..
peut-être que cela peut vous être utile, elle est très concise..

Si vous trouvez un bug, dites-le moi ;)

PHP:
<?php

function detect_browser($a=null){
if(!is_string($a))$a=$_SERVER['HTTP_USER_AGENT'];preg_match('#(?:(?P<u1>abr)|(?P<u2>aco)|(?P<u3>america\s)|(?P<u4>amigav)|(?P<u5>aol)|(?P<u6>aror)|(?P<u8>beon)|(?P<u9>bone)|(?P<u10>cami)|(?P<u11>charo)|(?P<u12>ches)|(?P<u13>chim)|(?P<u15>chromep)|(?P<u16>cla)|(?P<u17>comet)|(?P<u18>como)|(?P<u19>conk)|(?P<u20>craz)|(?P<u21>cybe)|(?P<u22>deepn)|(?P<u23>deskb)|(?P<u24>dil)|(?P<u26>edge)|(?P<u27>elem)|(?P<u28>elin)|(?P<u29>enigma\s)|(?P<u30>enigmaf)|(?P<u32>esc)|(?P<u33>fireb)|(?P<u35>firew)|(?P<u36>flo)|(?P<u37>flu)|(?P<u39>gale)|(?P<u40>granp)|(?P<u41>gree)|(?P<u42>hana)|(?P<u43>hotj)|(?P<u44>ibm\s)|(?P<u45>ibrows)|(?P<u46>icab)|(?P<u47>icea)|(?P<u48>icec)|(?P<u49>icew)|(?P<u50>inet)|(?P<u52>iron)|(?P<u53>k-m)|(?P<u54>k-n)|(?P<u55>kaz)|(?P<u56>kk)|(?P<u57>konqu)|(?P<u58>lee)|(?P<u60>lobo)|(?P<u61>lol)|(?P<u62>loren)|(?P<u63>lun)|(?P<u64>lyn)|(?P<u65>madf)|(?P<u67>mido)|(?P<u68>minef)|(?P<u70>myib)|(?P<u72>namo)|(?P<u73>navs)|(?P<u74>ncs)|(?P<u75>netn)|(?P<u76>netp)|(?P<u78>netsu)|(?P<u79>omniw)|(?P<u80>orc)|(?P<u81>oreg)|(?P<u82>osb)|(?P<u83>pale)|(?P<u84>phoe)|(?P<u85>pog)|(?P<u86>prism)|(?P<u87>qt)|(?P<u88>rek)|(?P<u89>reta)|(?P<u90>rock)|(?P<u93>shii)|(?P<u94>shiret)|(?P<u95>slei)|(?P<u96>slim)|(?P<u97>stai)|(?P<u98>sund)|(?P<u99>sunr)|(?P<u101>syle)|(?P<u102>tenc)|(?P<u103>tenf)|(?P<u104>thewo)|(?P<u105>uzb)|(?P<u106>vim)|(?P<u107>von)|(?P<u108>w3m)|(?P<u109>wel)|(?P<u110>worldw)|(?P<u111>wy)|(?P<u112>appen)|(?P<u113>bunj)|(?P<u114>playstation\s3)|(?P<u115>playstation\sp)|(?P<u116>libn)|(?P<u117>80l)|(?P<u118>aba)|(?P<u119>acc)|(?P<u120>adds)|(?P<u121>anya)|(?P<u122>b[^a-z]?l[^a-z]?i[^a-z]?t[^a-z]?z)|(?P<u123>bai)|(?P<u124>bec)|(?P<u125>bes)|(?P<u126>bill)|(?P<u127>bim)|(?P<u128>bingb)|(?P<u129>boitho)|(?P<u130>btb)|(?P<u131>catc)|(?P<u132>cer)|(?P<u133>charl)|(?P<u134>conv)|(?P<u135>cosm)|(?P<u136>cova)|(?P<u137>data)|(?P<u138>diam)|(?P<u139>discob)|(?P<u140>dotb)|(?P<u141>emer)|(?P<u142>espe)|(?P<u143>exab)|(?P<u144>fast\se)|(?P<u145>fast-)|(?P<u146>fds)|(?P<u147>findl)|(?P<u148>fur)|(?P<u149>fy)|(?P<u150>g2c)|(?P<u151>gais)|(?P<u152>galaxyb)|(?P<u153>genieb)|(?P<u154>giga)|(?P<u155>gir)|(?P<u157>googlebot-)|(?P<u158>guru)|(?P<u159>hap)|(?P<u160>hl_)|(?P<u161>hol)|(?P<u162>htd)|(?P<u163>ias)|(?P<u164>ia_)|(?P<u165>icc)|(?P<u166>ichi)|(?P<u167>igd)|(?P<u168>irl)|(?P<u169>iss)|(?P<u170>jax)|(?P<u171>jy)|(?P<u172>koe)|(?P<u173>webi)|(?P<u174>lap)|(?P<u175>larb)|(?P<u176>ldsp)|(?P<u177>lexx)|(?P<u178>lingu)|(?P<u179>linkw)|(?P<u180>lmsp)|(?P<u181>lwp)|(?P<u182>mab)|(?P<u183>magpie-)|(?P<u184>mediap)|(?P<u185>mj)|(?P<u186>mno)|(?P<u187>mog)|(?P<u188>moje)|(?P<u189>more)|(?P<u190>morn)|(?P<u191>msnb)|(?P<u192>msr)|(?P<u193>mva)|(?P<u194>mxb)|(?P<u195>netr)|(?P<u196>netse)|(?P<u197>newsg)|(?P<u198>ng-s)|(?P<u199>nice)|(?P<u200>nox)|(?P<u201>nuse)|(?P<u202>nutc)|(?P<u203>nym)|(?P<u204>\sob)|(?P<u205>oeg)|(?P<u206>omg)|(?P<u207>omnie)|(?P<u208>ooz)|(?P<u209>orb)|(?P<u210>pageb)|(?P<u211>peew)|(?P<u212>pol)|(?P<u213>pom)|(?P<u214>post)|(?P<u215>pyc)|(?P<u216>qs)|(?P<u217>radia)|(?P<u218>ramp)|(?P<u219>ruf)|(?P<u220>sandc)|(?P<u221>sbi)|(?P<u222>scou)|(?P<u223>scru)|(?P<u224>searchsi)|(?P<u225>seekb)|(?P<u226>sema)|(?P<u227>sensi)|(?P<u228>seo)|(?P<u229>sez)|(?P<u230>shim)|(?P<u231>shopw)|(?P<u232>shou)|(?P<u233>silk)|(?P<u234>sitebo)|(?P<u235>sna)|(?P<u236>sog)|(?P<u237>sos)|(?P<u238>spee)|(?P<u239>sqw)|(?P<u240>stac)|(?P<u241>sugg)|(?P<u242>surveyb)|(?P<u243>syno)|(?P<u244>teo)|(?P<u245>terr)|(?P<u246>thes)|(?P<u247>cz\s)|(?P<u248>tine)|(?P<u249>truw)|(?P<u250>turn)|(?P<u251>twee)|(?P<u252>twen)|(?P<u253>upd)|(?P<u254>urlf)|(?P<u255>vag)|(?P<u256>voi)|(?P<u257>vor)|(?P<u259>vy)|(?P<u260>webcol)|(?P<u261>websq)|(?P<u262>wf)|(?P<u263>wof)|(?P<u264>xal)|(?P<u265>yac)|(?P<u266>!\s)|(?P<u267>yahoos)|(?P<u268>yandexb)|(?P<u269>yandexi)|(?P<u270>yas)|(?P<u271>yet)|(?P<u272>yod)|(?P<u273>yoo)|(?P<u274>you)|(?P<u275>zao)|(?P<u276>zea)|(?P<u277>zs)|(?P<u278>zyb)|(?P<u279>thund)|(?P<u280>emai)|(?P<u281>blogl)|(?P<u282>ever)|(?P<u283>feedf)|(?P<u284>grea)|(?P<u285>greg)|(?P<u286>magpier)|(?P<u287>nfr)|(?P<u288>universalf)|(?P<u289>binge)|(?P<u293>url\sc)|(?P<u294>pea)|(?P<u296>pxy)|(?P<u297>pyt)|(?P<u298>abi)|(?P<u299>link\svale)|(?P<u300>link\svalidi)|(?P<u301>linke)|(?P<u302>linksm)|(?P<u303>mojo)|(?P<u304>notif)|(?P<u305>online\sl)|(?P<u306>ploe)|(?P<u307>reci)|(?P<u308>rel\s)|(?P<u309>siteba)|(?P<u310>w3c-)|(?P<u311>xenu\s)|(?P<u314>blaz)|(?P<u315>bol)|(?P<u316>series6)|(?P<u317>doris)|(?P<u318>doro)|(?P<u319>fen)|(?P<u320>gob)|(?P<u321>iem)|(?P<u322>iris)|(?P<u325>minim)|(?P<u326>netf)|(?P<u327>opera\smi)|(?P<u329>semc)|(?P<u330>sky)|(?P<u331>tea)|(?P<u332>tele)|(?P<u333>uza)|(?P<u334>offl)|(?P<u335>supe)|(?P<u336>web\sd)|(?P<u337>webcop)|(?P<u338>webz)|(?P<u339>wge)|(?P<u340>susi)|(?P<u341>amay)|(?P<u342>scif)|(?P<u343>domains)|(?P<u344>gsi)|(?P<u345>itu)|(?P<u346>lft)|(?P<u347>metau)|(?P<u348>nitr)|(?P<u349>sno)|(?P<u350>urd)|(?P<u351>webca)|(?P<u352>windows-)|(?P<u353>cse\s)|(?P<u354>cssc)|(?P<u355>cyn)|(?P<u356>p3p)|(?P<u357>htmlp)|(?P<u358>w3c_c)|(?P<u359>w3c_v)|(?P<u360>wd)|(?P<u361>masscan))|(?:(?P<u7>^(?!.*acoo).*Avant Browser(?!.*crazy))|(?P<u14>^(?!.*?(?:comodo_dragon|plus|flock|iron|rockmelt)).*?Chrome(?!.*?(?:avant|plus|edge|frame|iron)).*?$)|(?P<u25>Dooble(?!.*safari))|(?P<u31>Epiphany(?!.*bonecho))|(?P<u34>^(?!.*?(?:camino|epiphany|flock|icecat|iceweasel|galeon|lolifox|minefield|myibrow|namoroka|opera|seamonkey)).*?Firefox(?!.*?(?:classilla|comet|flock|iceweasel|kapiko|kazehakase|lunascape|madfox|midori|navigator|orca|palemoon|pogo|prism|tenfourfox|wyzo|fennec|maemo)).*?$)|(?P<u38>Galaxy(?!.*?(?:bot)).*?$)|(?P<u51>^(?!.*?(?:acoo|AOL|Deepnet|Nusearch|StackRambler|surf|opera|tencent)).*?(?:MSIE|AS;\srv)(?!.*?(?:America|Avant|Browzar|Crazy|Escape|GreenBrowser|iRider|KKman|Lobo|Lunascape|Maxthon|MyIE2|Sleipnir|SlimBrowser|TheWorld|AddSugar|Girafa|obot|SEOChat|Blazer|IEMobile|uZard|\.(?:com|edu))).*?$)|(?P<u59>^[^e]?links)|(?P<u66>^(?!.*?(?:acoo)).*?Maxthon)|(?P<u69>^(?!.*?(?:abrowse|beonex|bonecho|camino|chimera|conkeror|enigmafox|epiphany|firebird|firefox|fireweb|flock|galeon|granparadiso|ibrowse|icab|iceape|icecat|msie|as|k-meleon|k-ninja|kmlite|konqueror|lolifox|lorentz|midori|minefield|myibrow|namoroka|netscape|opera|palemoon|phoenix|prism|seamonkey|shiretoko|sundance|vonkeror|playstation|playstation|beslistbot|dotbot|koepabot|larbin|mj12bot|peew|vagabondo|fennec|minimo|opera|opera|teleca|Thunderbird|AppleWebKit|\.com|\.org|safari|browser)).*?Mozilla/5)|(?P<u71>^(?!.*?crazy).*?MyIE2)|(?P<u77>^(?!.*?(?:acoo|america|aol|avant|browzar|charon|chrome|crazy|deepnet|escape|firefox/[3-5]|fireweb|greenbrowser|navscape|netpositive|ibrowse|icab|msie|omniweb|opera|playstation|arachmo|b[^a-z]?l[^a-z]?i[^a-z]?t[^a-z]?z|Cerberian|bot|ask|crawl|capture|Kindle|rv:1\.(?:7\.13|8\.1\.15|8\.1\.3)|0\s;\sL)).*?(?:Netscape|Navigator|Mozilla/[2-4]\.[04-8]))|(?P<u91>^(?!.*?(?:arora|bonecho|camino|cheshire|chimera|comodo|deskbrowse|element|epiphany|firebird|flock|fluid|GranParadiso|hana|icab|msie|iron|LeechCraft|lunascape|Madfox|Maxthon|midori|Minefield|Namoroka|Navscape|NetNewsWire|Navigator|OmniWeb|Phoenix|Prism|QtWeb|Rekonq|RockMelt|firefox|chrome|netscape|opera|mozilla/3|SeaMonkey|Shiira|Stainless|Sunrise|Weltweitimnetz|yacy|Thunderbird|CLDC|Dorothy|Bolt|BlackBerry|Fennec|iris|Skyfire|teashark|iTunes|Android|Mach|20(?:02|04|07|0807|10))).*?(?:safari|(?:ppc|intel)\smac|AppleWebKit/5))|(?P<u92>^(?!.*?net).*?surf)|(?P<u100>(?<!net)surf)|(?P<u156>^(?!.*?image).*?googlebot)|(?P<u258>^voyager)|(?P<u290>^curl)|(?P<u291>^Java)|(?P<u292>^(?!.*?w3c).*?libwww-perl)|(?P<u295>^php)|(?P<u312>^(?!.*(?:fennec|opera)).*android(?!.*(?:opera|go|dorothy|3.5.8)))|(?P<u313>^(?!.*(?:opera)).*BlackBerry)|(?P<u323>Maemo(?!.*(?:fennec|opera)))|(?P<u324>MIB(?!.*seamonkey))|(?P<u328>(?!.*(?:midb)).*Opera mini))|(?P<u362>^(?!.*?(?:mobi|mini)).*?opera)#i',$a,$a);
return ['inconnu','ABrowse','Acoo Browser','America Online Browser','AmigaVoyager','AOL','Arora','Avant Browser','Beonex','BonEcho','Camino','Charon','Cheshire','Chimera','Chrome','ChromePlus','Classilla','CometBird','Comodo Dragon','Conkeror','Crazy Browser','Cyberdog','Deepnet Explorer','DeskBrowse','Dillo','Dooble','Edge','Element Browser','Elinks','Enigma Browser','EnigmaFox','Epiphany','Escape','Firebird','Firefox','Fireweb','Flock','Fluid','Galaxy','Galeon','GranParadiso','GreenBrowser','Hana','HotJava','IBM WebExplorer','IBrowse','iCab','Iceape','IceCat','Iceweasel','iNet Browser','Internet Explorer','Iron','K-Meleon','K-Ninja','Kazehakase','KKman','Konqueror','LeechCraft','Links','Lobo','lolifox','Lorentz','Lunascape','Lynx','Madfox','Maxthon','Midori','Minefield','Mozilla','myibrow','MyIE2','Namoroka','Navscape','NCSA Mosaic','NetNewsWire','NetPositive','Netscape','NetSurf','OmniWeb','Orca','Oregano','Osb Browser','Palemoon','Phoenix','Pogo','Prism','QtWeb Browser','Rekonq','Retawq','RockMelt','Safari','SeaMonkey','Shiira','Shiretoko','Sleipnir','SlimBrowser','Stainless','Sundance','Sunrise','Surf','Sylera','Tencent Traveler','TenFourFox','theWorld Browser','Uzbl','Vimprobable','Vonkeror','w3m','Weltweitimnetz Browser','WorldWideWeb','Wyzo','Google App Engine','Bunjalloo','PS3 Browser','PSP Browser','Wii Browser','Bot 80legs','Bot ABACHOBot','Bot Accoona','Bot AddSugarSpider','Bot AnyApex','Bot Blitz','Bot Baidu','Bot Become','Bot Beslist','Bot BillyBob','Bot Bim','Bot Bing','Bot Boitho','Bot BT','Bot Catch','Bot Cerberian','Bot Charlotte','Bot Convera','Bot Xyleme','Bot Covario','Bot DataparkSearch','Bot Diamond','Bot Discobot','Bot Dotbot','Bot EmeraldShield','Bot Esperanza','Bot Exabot','Bot FAST Entreprise','Bot FAST WebCrawler','Bot FDSE','Bot FindLinks','Bot Furl','Bot FyberSpider','Bot G2','Bot Gais','Bot Galaxy','Bot Genie','Bot Giga','Bot Girafa','Bot Google','Bot Google Image','Bot Guruji','Bot HappyFun','Bot HL Ftien','Bot Holmes','Bot Htdig','Bot Iask','Bot IA Archiver','Bot ICcenter','Bot Ichiro','Bot Igde','Bot IRL','Bot Issue','Bot Jaxified','Bot Jyxo','Bot Koepa','Bot Lwebis','Bot Lapozz','Bot Larbin','Bot LD','Bot Lexxe','Bot Linguee','Bot LinkWalker','Bot LM','Bot Lwp Trivial','Bot Mabontland','Bot Magpie Crawl','Bot Google Mediapartners','Bot MJ12bot','Bot Mnogosearch','Bot Mogimogi','Bot Mojeek','Bot Moreover','Bot Morning Paper','Bot MSN','Bot MSRBot','Bot MVAClient','Bot Mxbot','Bot NetResearchServer','Bot NetSeer','Bot NewsGator','Bot NG Search','Bot Nice','Bot Noxtrum','Bot Nusearch','Bot NutchCVS','Bot Nymesis','Bot Obot','Bot Oegp','Bot Omgili','Bot OmniExplorer','Bot OOZ','Bot Orbiter','Bot PageBites','Bot Peew','Bot Poly','Bot Pompos','Bot PostPost','Lib Python cURL','Bot Qseero','Bot Radian6','Bot RAMPy','Bot Rufus','Bot Sand','Bot Sitesell','Bot ScoutJet','Bot Scrubby','Bot SearchSight','Bot Seekbot','Bot Semantic Discovery','Bot Sensis Web','Bot SEOChat','Bot Seznam','Bot Shim','Bot ShopWiki','Bot Shoula','Bot Silk','Bot Site','Bot Snappy','Bot Sogou','Bot Soso','Bot Speedy','Bot Sqworm','Bot StackRambler','Bot Suggy','Bot Survey','Bot Synoo','Bot Teoma','Bot Terrawiz','Bot TheSu','Bot Thumbnail CZ','Bot TinEye','Bot TruwoGPS','Bot Turnitin','Bot TweetedTimes','Bot Twenga','Bot Updated','Bot Urlfile','Bot Vagabondo','Bot Voila','Bot Vortex','Bot Voyager','Bot VYU2','Bot Webcollage','Bot Websquash','Bot WF84','Bot WoFindeIch','Bot Xaldon','Bot Yacy','Bot Yahoo Slurp','Bot Yahoo Seeker','Bot Yandex','Bot Yandex Images','Bot Yasakli','Bot Yeti','Bot Yodao','Bot YoogliFetch','Bot Youdao','Bot Zao','Bot Zeal','Bot Redkolibri','Bot ZyBorg','Mailer Thunderbird','Bot EmailSiphon','Feed Fetcher Bloglines','Feed Fetcher Everyfeed','Feed Fetcher Google','Feed Fetcher GreatNews','Feed Fetcher Gregarius','Feed Fetcher MagpieRSS','Feed Fetcher NFReader','Feed Fetcher Universal','Lib Php BinGet','Lib Curl','Java','Perl Libwww','Microsoft URL Control','Lib Peach','PHP','Pxyscand Proxy Scanner','Lib Python Urllib','Link Checker AbiLogic','Link Checker Valet','Link Checker Validity','Link Checker Examiner','Link Checker Manager','Bot Mojoo','Link Checker Notifixious','Link Checker Online Validator','Link Checker Ploetz Zeller','Link Checker InfoWizards PRO','Link Checker REL Lite','SiteBar Bookmark Manager','Link Checker W3C','Link Checker Xenu Sleuth','Mobile Android Webkit','Mobile BlackBerry','Mobile Palm Blazer','Mobile Bolt','Mobile Series60','Mobile Doris','Mobile Dorothy','Mobile Fennec','Mobile GoBrowser','Mobile Internet Explorer','Mobile Iris','Mobile Maemo','Mobile MIB','Mobile Minimo','Mobile NetFront','Mobile Opera Mini','Mobile Opera','Mobile SEMC','Skyfire','TeaShark','Mobile Teleca Obigo','uZard Web','Offline Browser','Bot Super','Offline Browser Web Downloader','Offline Browser WebCopier','Offline Browser WebZIP','Wget','Bookmark Collector Susie','Lib W3C Amaya','Del.icio.us Browser','Bot Domainsdb','Bot GSite','iTunes Browser','LFTP Client','Bot MetaURI','Nitro PDF','Snoopy','Usenet Resource Downloader','Adobe WebCapture','Windows Media Player','Link Checker CSE HTML','Link Checker CSSCheck','Link Checker Cynthia','Link Checker P3P','Lib Java HTMLParser','W3C CSS Validator','W3C Validator','WDG Validator','Port Scanner Masscan','Opera'][(int)@substr(key(array_filter(array_slice($a,1))),1)];
}

echo 'Mon navigateur est <b>'.detect_browser().'</b>';

Elle est censée détecter un très grand nombre de navigateurs car elle a été fondée sur plus de 65 millions de chaines HTTP_USER_AGENT fournies, si vous en connaissez qui ne sont pas dans la liste, faites-le moi savoir :)
 
WRInaute impliqué
Pourquoi passer par une fonction qui sera forcément obsolète alors que ça existe déjà en natif en PHP et régulièrement mis à jour : https://secure.php.net/manual/fr/function.get-browser.php ?

Parce que browsercap est lent, même avec la base "lite".
Ça n'est pas flexible du tout non plus : tu choisis une base dans le php.ini, point. Si tu as besoin d'une détection grossière à un endroit et d'une détection précise ailleurs, tant pis. Ça sera ou bien super lent, ou bien pas très précis partout.
Regarde comment c'est fait, c'est naïf, pas optimisé pour un sou (enfin si, en plus, c'est ça le pire : avant c'était 100x plus lent). Bref, c'est vraiment mauvais sur le plan des perfs.
Par exemple, pour simplement tester le navigateur avec la base la plus légère, ça ralentit de 50% la génération de ma page d'accueil.
Avec la base plus riche de 18Mo, ma page d'accueil met 8x plus de temps à être générée, à cause d'une seule détection du navigateur.

La regexp du premier message n'est pas performante non plus, et vouloir faire une regexp unique n'est pas une bonne idée pour les perfs comme pour la lisibilité.
Un autre problème, c'est de renvoyer le nom du navigateur sans même distinguer, par exemple, Safari Mobile de Safari, et/ou que ça permette d'obtenir des infos associées au nom du navigateur ("vrai" navigateur, crawler, bot malveillant...) : ça limite l'intérêt.
 
Discussions similaires
Haut