我一直在使用Javascript的
根据MDN和W3schools的说明:
"match() 方法用于检索字符串中指定的正则表达式的匹配项。返回一个由匹配结果组成的数组对象。"
我首先进行一次解析,以获取所需的基本字符串:
以下是我的输出结果(数组形式):
string.match(*regex*)
函数来解析navigator.userAgent
字符串。根据MDN和W3schools的说明:
"match() 方法用于检索字符串中指定的正则表达式的匹配项。返回一个由匹配结果组成的数组对象。"
我首先进行一次解析,以获取所需的基本字符串:
var userAgent = navigator.userAgent;
var splitted = userAgent.match(/[(][^)]+[)]|\w+\/\S+/ig);
以下是我的输出结果(数组形式):
Mozilla/5.0
(Macintosh; Intel Mac OS X 10_10_3)
AppleWebKit/537.36
(KHTML, like Gecko)
Chrome/41.0.2272.76
Safari/537.36
然后我用for循环解析Navigator/Version类型的字符串。
for (var i = 0; i < splitted.length; i++ ) {
var str = splitted[i];
if (str[0] == '(') {
} else {
var name = str.match(/[^\/]+/i);
var version = str.match(/[0-9|\.]+/i);
}
然而,令人惊讶的是,尽管我得到了期望的结果,我得到了一个字符串对象作为名称和一个数组对象作为版本
这怎么可能呢?
以下是代码片段(fiddle):
var userAgent = navigator.userAgent;
var splitted = userAgent.match(/[(][^)]+[)]|\w+\/\S+/ig);
var outputDiv = document.getElementById("log");
for (var i = 0; i < splitted.length; i++ ) {
var str = splitted[i];
if (str[0] == '(') {
} else {
var name = str.match(/[^\/]+/i);
var version = str.match(/[0-9|\.]+/i);
outputDiv.innerHTML += name.toString() + " is a " + typeof(name) + "<br>";
outputDiv.innerHTML += version.toString() + " is a " + typeof(version) + "<br>";
}
};
<div id="log"></div>
--- 更新 ---
感谢 FactoryAidan 的回答,问题出在作用域上。
结论:在命名全局变量时要小心 :)
.match()
只能返回Array
或null
。 - Cᴏʀʏ/g
标志,match
返回捕获组而不是每个匹配项。例如:"test".match(/te(st)/)
是["test", "st"]
。这里是一个元素的数组,但仍然是一个数组。 - Ry-