Регулярное выражение Javascript не работает в IE 6-9: ошибка «Ожидается функция» - PullRequest
2 голосов
/ 30 июня 2011

У меня есть следующий код:

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;
};

Это все еще не работает (жалуется на .map в IE), но, что интересно, также не работает в сафари (и, возможно, в других браузерах). Есть причина почему?

Вы заметите, что выходные данные (document.write из новой функции:

2008 11 01 20 39: 57,78 57,78 78 -06: 00

Из старой функции:

2008 11 1 20 39 57 780 -6

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Согласно регулярные-выражения.info , вы должны использовать re.exec(s) вместо re(s). На странице также упоминается re.test(s), но это просто возвращает true или false, re.exec(s) на самом деле возвращает совпадения, что, как представляется, то, что вы хотите.

2 голосов
/ 03 июля 2011

Относительно .map

Метод массива .map() является одним из новых дополнений, предоставляемых ECMAScript 5; последняя официальная версия JavaScript (5.0 по состоянию на декабрь 2009 года и сейчас 5.1 по состоянию на июнь 2011 года). Немногие (если есть) браузеры полностью поддерживают версию 5 (и, конечно, не IE6). Вы можете поспорить, что пройдет некоторое время, прежде чем вы сможете использовать браузеры для поддержки всех новых функций (например, Array.map()).

Относительно даты регулярное выражение

К сожалению, JavaScript не позволяет задавать регулярные выражения в режиме свободного пробела. Это затрудняет чтение таких длинных регулярных выражений, как этот. Чтобы пролить свет на причину, по которой ваш алгоритм не работает, я добавил комментарии к вашему регулярному выражению, которые указывают, какие группы захвата действительно захватывают. Вот он в синтаксисе PHP:

$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?

Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...