首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript regex在IE 6-9中不起作用:"Function expected“错误

Javascript regex在IE 6-9中不起作用:"Function expected“错误
EN

Stack Overflow用户
提问于 2011-06-30 21:48:14
回答 2查看 1.8K关注 0票数 2

我有以下代码:

代码语言:javascript
复制
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:需要函数

它指向这条线:

代码语言:javascript
复制
        var a=re(s).slice(1).map(function(x,i){

有人知道这出了什么问题以及如何修复它吗?

谢谢,韦斯利

编辑:

如果我把代码改成这样:

代码语言:javascript
复制
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 78 -06:00

来自旧函数:

2008 11 1 20 39 57 780 -6

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-03 12:39:02

关于.map

.map()数组方法是ECMAScript 5提供的新功能之一;它是JavaScript的最新官方版本(2009年12月为5.0,2011年6月为5.1 )。几乎没有(如果有的话)浏览器完全支持版本5(当然不是IE6)。可以肯定的是,在依赖浏览器支持所有新功能(如Array.map())之前,还需要一段时间。

关于日期正则表达式

遗憾的是,JavaScript不允许使用自由空格模式指定正则表达式。这使得像这样的长正则表达式很难读懂。为了阐明算法不起作用的原因,我在您的正则表达式中添加了注释,这些注释指出了捕获组真正捕获的内容。下面是PHP语法:

代码语言:javascript
复制
$re_iso8601_date_needs_work = '%# Original Date regex
    (\d\d\d\d)\D?  # $1: Year.
    (\d\d)\D?      # $2: Month.
    (\d\d)\D?      # $3: Day.
    (\d\d)\D?      # $4: Hour.
    (              # $5: Minute and second. ???
      \d\d\D?      # Minute.
      (            # $6: Optional second.
        \d\d\.?    # Second (whole portion).
        (\d*)      # $7: Second (fractional portion).
      )?           # Second is optional.
    )              # End $5: minute and second.
    (              # $8: Optional timezone alternatives.
      Z            # Either UTC/Zulu.
    | [+-]\d\d?    # Or offset from UTC. Hours and
      (:\d\d)?     # $9: optional minutes.
    )?             # Timezone is optional.%x';

提示:小数秒的单位是$7,而不是$6。为什么要在组$5中同时捕获分钟和秒

希望这能有所帮助!:)

票数 1
EN

Stack Overflow用户

发布于 2011-06-30 22:01:34

根据regular-expressions.info的说法,你应该使用re.exec(s)而不是re(s)。该页面还提到了re.test(s),但这只是返回true或false,re.exec(s)实际上返回了匹配,这似乎就是您想要的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6535774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档