Javascript正则表达式在IE 6-9中不起作用:;“预期功能”;错误
我有以下代码:Javascript正则表达式在IE 6-9中不起作用:;“预期功能”;错误,javascript,regex,internet-explorer,Javascript,Regex,Internet Explorer,我有以下代码: function parseDate(s) { var date = new Date(s); if (!isValidDate(date)) { //iso 860 date parser, as some browsers do not support this via new Date yet var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d
function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
//iso 860 date parser, as some browsers do not support this via new Date yet
var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
var a=re(s).slice(1).map(function(x,i){
if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
return parseInt(x,10)||0;
});
date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
}
return date;
};
function isValidDate(d) {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
return false;
return !isNaN(d.getTime());
}
这适用于除IE6-9之外的所有浏览器。我得到了一个错误:
SCRIPT5002:需要函数
它指向这条线:
var a=re(s).slice(1).map(function(x,i){
有人知道这有什么问题以及如何解决吗
谢谢,
卫斯理
编辑:
如果我将代码更改为:
function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
//iso 860 date parser, as some browsers do not support this via new Date yet
var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
var a = re.exec(s);
if (a) {
a = a.slice(1);
a.map(function(x,i){
if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
return parseInt(x,10)||0;
});
document.getElementById('test1').innerHTML = (a[0] + ' ' + a[1] + ' ' + a[2] + ' ' + a[3] + ' ' + a[4] + ' ' + a[5] + ' ' + a[6] + ' ' + a[7]);
date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
}
}
return date;
};
它仍然不起作用(抱怨IE中的.map),但有趣的是,它在safari(也许还有其他浏览器)中也不起作用。有什么原因吗
您将注意到,新函数的输出(document.write)是:
2008 11 01 20 39:57.78 57.78-06:00
从旧函数:
2008 11 20 39 57 780-6根据,你应该使用re.exec(s)
,而不是re(s)
。页面还提到re.test(s)
,但这只是返回真或假,re.exec(s)
实际上返回匹配项,这似乎是你想要的。关于.map
.map()
数组方法是ECMAScript 5提供的新添加内容之一;ECMAScript 5是JavaScript的最新官方版本(2009年12月为5.0,2011年6月为5.1)。目前很少(如果有的话)浏览器完全支持版本5(当然不是IE6)。您可以打赌,要依靠浏览器支持所有新功能(例如Array.map()
)还需要一段时间
关于regex的日期
不幸的是,JavaScript不允许使用自由间距模式指定正则表达式。这使得像这样的长正则表达式很难阅读。为了解释算法不起作用的原因,我在正则表达式中添加了注释,这些注释指示捕获组真正捕获的内容。以下是PHP语法:
$re_iso8601_date_needs_work='%#原始日期正则表达式
(\d\d\d\d)\d?#$1:年。
(\d\d)\d?#2美元:月。
(\d\d)\d?#$3:天。
(\d\d)\d?#$4:小时。
(#5美元:分和秒???
\d\d\d?#分钟。
(#6美元:可选秒。
\d\d\?#秒(整个部分)。
(\d*)#$7:秒(分数部分)。
)?#第二个选项是可选的。
)#结束5美元:分每秒。
(#$8:可选时区选项。
Z#UTC/祖鲁。
|[+-]\d\d?#或与UTC时数的偏移量和
(:\d\d)?#$9:可选分钟数。
)?#时区是可选的。%x';
提示:分数秒在$7
中,而不是$6
中。为什么在$5
组中同时捕获分和秒
希望这有帮助!:)谢谢,我改了。请看我上面的编辑,这似乎没有帮助,现在它在safari(也许还有其他浏览器)中也不起作用。@Quickfire55-我总是对答案进行投票,这不是你的意思吗?编辑:谢谢,我现在接受了前面问题的答案。。。我忘了!我们将从现在开始这样做。