我想用Javascript检测Chrome操作系统,我正在使用navigator.userAgent
。现在,我正在运行Chrome操作系统,我的导航器userAgent是
Mozilla/5.0 (X11; CrOS armv7l 6680.78.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.102 Safari/537.36
现在。我使用正则表达式检查userAgent的样式,并编写下面的代码。
<script>
if ( navigator.userAgent = /^Mozilla\/\d{1}^.\d{1}^(X11; CrOS i\d{3} \d{1}^.\d{2}\d{3} ^AppleWebKit\/\d{3}^.\d{2} ^(KHTML, like Gecko) Chrome\/ \d{2}^.\d{1}^.\d{3}^.\d{2} ^Safari\/\d{3}^\d{2}/ ){
console.log(navigator.userAgent);
} else {
console.log(navigator.userAgent);
}
</script>
现在,加载此脚本后,我收到错误。
Uncaught SyntaxError: Invalid regular expression: /^Mozilla\/\d{1}^.\d{1}^(X11; CrOS i\d{3} \d{1}^.\d{2}\d{3} ^AppleWebKit\/\d{3}^.\d{2} ^(KHTML, like Gecko) Chrome\/ \d{2}^.\d{1}^.\d{3}^.\d{2} ^Safari\/\d{3}^\d{2}/: Unterminated group
我的代码有什么问题?
答案 0 :(得分:8)
它抱怨的是,您的(
没有匹配)
。在正则表达式中,(
和)
定义捕获组并且必须进行平衡。如果您想匹配实际的(
或)
,则必须使用反斜杠转义它。
但还有其他一些问题。例如,将^
(&#34;输入的开头&#34;)放在表达式的开头的任何地方都没有意义。
但我不认为还有其他任何内容将CrOS
放入用户代理中,所以可能只是简单地说:
if (/\bCrOS\b/.test(navigator.userAgent)) {
// yes, it is (probably, if no one's mucked about with their user agent string)
} else {
// No, it isn't (probably, if no one's mucked about with their user agent string)
}
\b
是&#34;字边界&#34;所以我们不会在一个单词的中间匹配该字符串。请注意,我将其区分大小写。
旁注:我发现https://regex101.com/#javascript(我没有任何关联)对于调试正则表达式非常有用。
附注2:如果您确实需要检测ChromeOS,则上述内容非常有用,但如果它只是您需要检查的功能,则为jfriend00 points out ,特征检测可能是更好的方法。
答案 1 :(得分:4)
这个怎么样?
var chromeOS = /(CrOS)/.test(navigator.userAgent);
因为Chrome操作系统用户代理如下所示:
Mozilla/5.0 (X11; CrOS i686 0.12.433) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.77 Safari/534.30
过滤掉“CrOS”是一个很好的解决方案。
答案 2 :(得分:2)
我用这个:
这很简单,您可以避免使用正则表达式。如果您愿意,可以添加更多代理。
// Detect if the OS is Windows or Chrome OS
var detectedOS;
if (window.navigator.userAgent.indexOf("Windows") != -1) {detectedOS = "Windows";}
if (window.navigator.userAgent.indexOf("CrOS") != -1) {detectedOS = "Chrome";}
alert("detectedOS: " + detectedOS);