2012-06-23 9 views
5

Nếu tôi có một iOS user-agent nhưPhát hiện iOS Version Number từ User Agent sử dụng Regular Expressions

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 như Mac OS X; en-us) AppleWebKit /532.9 (KHTML, như Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

hoặc

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 như Mac OS X ; en-us) AppleWebKit/532.9 (KHTML, như Gecko) Điện thoại di động/7D11

Tôi làm cách nào để phát hiện phiên bản iOS bằng cách sử dụng cụm từ thông dụng để nó trở về, ví dụ:

4,0

cho user agent trên?

+1

ngôn ngữ nào bạn sẽ được giải nén nó với? –

+0

Tôi đang viết mã bằng PHP – user1477182

Trả lời

5

biểu thức chính quy này nên làm những gì bạn muốn:

/iPhone OS (\d+)_(\d+)\s+/ 

bạn phải nắm bắt được hai giá trị nhóm phù hợp, làm thế nào để làm điều đó phụ thuộc vào ngôn ngữ bạn sử dụng ...

Với php bạn có thể làm điều đó theo cách này:

$txt = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7'; 
$reg = '/iPhone OS (\d+)_(\d+)\s+/'; 
$a = array(); 
preg_match($reg, $txt, $a); 

$str_version = $a[1].'.'.$a[2]; // This variable should now contain : 4.0 
+0

Rất cám ơn! Nếu tôi đã làm điều này trong PHP, tôi chỉ cần sử dụng mẫu ở trên trong một hàm preg_match? – user1477182

+0

Có, bạn có thể sử dụng nó. Xem câu trả lời cập nhật của tôi ... – aleroot

+0

Cảm ơn rất nhiều! :) – user1477182

9

Các regEx rằng đang làm việc đối với tôi là:

/OS ((\d+_?){2,3})\s/ 

Một iPad 5.1.1 có HTTP_USER_AGENT như thế này:

"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3" 

Vì vậy 3 số trong phiên bản iOSkhông hệ điều hành iPhone hiện.

Một thực hiện của Ruby có thể là:

def version_from_user_agent(user_agent) 
    version = user_agent.match(/OS ((\d+_?){2,3})\s/) 
    version = version[1].gsub("_",".") if version && version[1] 
end 

Nó trả nil nếu không muốn nói iOS phiên bản tìm thấy

3

regex này sẽ phù hợp 2 và 3 phân đoạn như 4.0 hoặc 6.1.3

/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/ 

Ví dụ Javascript:

> navigator.userAgent 
    "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146" 
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/); 
    ["6_1_2"] 

Lưu ý rằng điều này cũng có thể phù hợp với các thiết bị khác, vì vậy hãy đảm bảo bạn thử nghiệm thiết bị này trên thiết bị iOS.

Điều này sẽ trả về phiên bản OS X trên máy Mac.

> navigator.userAgent 
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1" 
> navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/); 
    ["10_8_4"] 

Bạn cũng có thể muốn thay thế _ bởi . sử dụng .replace(/_/g,'.'); hay thậm chí chuyển đổi nó vào một mảng sử dụng .split('_');.

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/); 
if(_iOSDevice) 
_iOSVersion = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/)||[''])[0].replace(/_/g,'.'); 
0

Tôi tìm thấy câu trả lời hiện không có một tỷ lệ thành công tốt khi thử nghiệm chống lại các chuỗi tác nhân người dùng có thể vào trang web này các chuỗi đại lý ví dụ sử dụng:

http://www.webapps-online.com/online-tools/user-agent-strings/dv/operatingsystem51849/ios

Tôi đã tạo regex sau đây có nhiều thành công hơn khi được thử nghiệm dựa trên các ví dụ sau:

(iPad|iPhone|iphone|iPod).*?(OS |os |OS\_)(\d+((_|\.)\d)?((_|\.)\d)?) 

Nhóm thứ tư chứa phiên bản ios số có định dạng x_y_z hoặc x.y.z trong đó y và z là tùy chọn.

Có 7 ví dụ về chuỗi tác nhân người dùng không chứa bất kỳ số phiên bản nào để những chuỗi cụ thể không khớp. Có một chuỗi ví dụ trong đó phiên bản ios là "7.1" nhưng regex chỉ khớp với số phiên bản chính "7" (điều này đủ tốt cho trường hợp sử dụng của tôi)

Cũng như các thử nghiệm ở trang trên được thử nghiệm chống lại các chuỗi đại lý ios10 được liệt kê trên trang này:

https://myip.ms/view/comp_browsers/1983/Safari_10.html