2016-11-04 10 views
0

이 코드를 사용하고 있습니다 :PHP 정규식 OS 감지

<? 
$osList = array (
/* -- WINDOWS -- */ 
'Windows 10 (Windows NT 10.0)' => 'windows nt 10.0', 
'Windows 8.1 (Windows NT 6.3)' => 'windows nt 6.3', 
'Windows 8 (Windows NT 6.2)' => 'windows nt 6.2', 
'Windows 7 (Windows NT 6.1)' => 'windows nt 6.1', 
'Windows Vista (Windows NT 6.0)' => 'windows nt 6.0', 
'Windows Server 2003 (Windows NT 5.2)' => 'windows nt 5.2', 
'Windows XP (Windows NT 5.1)' => 'windows nt 5.1', 
'Windows 2000 sp1 (Windows NT 5.01)' => 'windows nt 5.01', 
'Windows 2000 (Windows NT 5.0)' => 'windows nt 5.0', 
'Windows NT 4.0' => 'windows nt 4.0', 
'Windows Me (Windows 9x 4.9)' => 'win 9x 4.9', 
'Windows 98' => 'windows 98', 
'Windows 95' => 'windows 95', 
'Windows CE' => 'windows ce', 
'Windows (version unknown)' => 'windows', 
/* -- MAC OS X -- */ 
'Mac OS X Beta (Kodiak)' => 'Mac OS X beta', 
'Mac OS X Cheetah' => 'Mac OS X 10.0', 
'Mac OS X Puma' => 'Mac OS X 10.1', 
'Mac OS X Jaguar' => 'Mac OS X 10.2', 
'Mac OS X Panther' => 'Mac OS X 10.3', 
'Mac OS X Tiger' => 'Mac OS X 10.4', 
'Mac OS X Leopard' => 'Mac OS X 10.5', 
'Mac OS X Snow Leopard' => 'Mac OS X 10.6', 
'Mac OS X Lion' => 'Mac OS X 10.7', 
'Mac OS X Mountain Lion' => 'Mac OS X 10.8', 
'Mac OS X Mavericks' => 'Mac OS X 10.9', 
'Mac OS X Yosemite' => 'Mac OS X 10.10', 
'Mac OS X El Capitan' => 'Mac OS X 10.11', 
'macOS Sierra' => 'Mac OS X 10.12', 
'Mac OS X (version unknown)' => 'Mac OS X', 
'Mac OS (classic)' => '(mac_powerpc)|(macintosh)', 
/* -- OTHERS -- */ 
'OpenBSD' => 'openbsd', 
'SunOS' => 'sunos', 
'Ubuntu' => 'ubuntu', 
'Linux (or Linux based)' => '(linux)|(x11)', 
'QNX' => 'QNX', 
'BeOS' => 'beos', 
'OS2' => 'os/2', 
'SearchBot'=>'(nuhk)|(googlebot)|(yammybot)|(openbot)|(slurp)|(msnbot)|(ask jeeves/teoma)|(ia_archiver)' 
); 

$useragent = htmlspecialchars($_SERVER['HTTP_USER_AGENT']); 
$useragent = strtolower($useragent); 

foreach($osList as $os=>$match) { 
    if (preg_match('/' . $match . '/i', $useragent)) { 
     break; 
    } else { 
     $os = "Unknown";  
    } 
} 
?> 

문제는 여기에 있습니다 : 나는 OS X 엘 카피 탄 (10.11.5)이 코드를 사용하고 있습니다 내가 'Mac OS X El Capitan' => 'Mac OS X 10.11'이기 때문에 OS X 푸마 (10.1)을 사용하고 있음을 보여줍니다.

preg_match$match이 "X.Y (.Z)" 일 경우 어떻게 확인합니까?

+0

우연히'strpos()'가 도움이됩니까? – Maximus2012

+0

잘 모르겠습니다. 사용 예를 제공 할 수 있습니까? 감사. –

+2

[이 질문] (http://stackoverflow.com/q/18070154/697370)에 답이 있습니까? 그렇다면이 사본을 복제본으로 닫을 수 있습니다. –

답변

2

문자 예를 들어, 그것은 숫자 하지입니다 다음과 같은 경우에만 일치 OS X 푸마의 경우에 1 후 문자 클래스를 추가 할 수 있습니다

'Mac OS X Puma' => 'Mac OS X 10.1[^0-9]', 

이 안전해야 안정적으로 당신이 현재에 일치하는 사용자 에이전트 문자열이 높은이 있음을 주목해야한다 등의


Mac OS X 10.1999.42으로, 현재와 미래의 버전 대 버전 10.1을 검출 브라우저간에 다른 확률, 또는 브라우저 내에서 사용자가 편집 할 확률. 높은 수준의 일치가 필요한 경우 사용자 에이전트 스니핑 이외의 방법이 필요합니다.

+0

좋은 접근 방식, 감사합니다! '[^ 0-9]'는 점을 고려합니까? 예 :'10.11.5'. –

+0

모든 것은 말하자면, 그 다음에 오는 문자가있을 것이며, 그것이 _not_ 디지트가 아닌 한 일치 할 것입니다. 위 정규 표현식의 점은 이스케이프 처리되지 않으므로 실제로는 사용자 에이전트 문자열의 _underscores_와 일치합니다. 밑줄은 숫자가 아니므로 일치합니다 (예 : 버전 10.1의 개정 53에 대해서는'10_1_53 '입니다 (개정이있는 경우). –

+0

즉 '10.1.10 '은'10.11.5'와 혼동 될 수 있습니다. 어쨌든, Regex가 나의 현재의 문제를 해결한다고 덧붙인다. –