2015-02-18 4 views
2

Кто-нибудь знает, есть ли способ проверить правильность ли строки? Я пытаюсь заблокировать недействительные даты, но не форсировать какой-либо формат даты. В основном вот в чем проблема:Проверка правильности заданной строки

!!Date.parse('hello 1') === true 

Javascript может определить дату из этой строки, поэтому это дата. Я бы предпочел, чтобы этого не случилось. Кто угодно?

+0

Посмотрите на moment.js. Это javascript framework для этих ситуаций – gh9

+1

Я использую moment.js, он также считает, что «привет 1» - это дата. –

+0

Я искал Stack Overflow и нашел это: http://stackoverflow.com/questions/13230360/string-date-to-javascript-date-parse-date –

ответ

2

Как близко вы могли бы избавиться от пробелов вокруг слов? Он, по крайней мере, сорвет «привет 1» и тому подобное.

Date.parse('hello 1'.replace(/\s*([a-z]+)\s*/i, "$1")); // NaN 
Date.parse('jan 1'.replace(/\s*([a-z]+)\s*/i, "$1")); // Valid 

[обновление] Хорошо, так что мы просто заменить любые не-буквы, цифры, которые попадают между буквой и номером:

replace(/([a-z])\W+(\d)/ig, "$1$2") 
+0

Очень близко. Единственное, на что это не распространяется, - проверка возвращаемого значения 'new Date()'. Используя эту логику, она говорит, что это NaN. –

+0

Я имею в виду, если мы передадим возвращаемое значение новой Date(), это не сработает. Итак, 'Date.parse (« Среда 18 февраля 2015 17:59:11 GMT-0500 (EST) ». Replace (/ \ s * ([az] +) \ s */i," $ 1 "))' –

+0

PERFECT ! Мерси, добрый сэр. –

0

Используйте эту функцию для проверки date

function isDate(s) 
{ 
    if (s.search(/^\d{1,2}[\/|\-|\.|_]\d{1,2}[\/|\-|\.|_]\d{4}/g) != 0) 
    return false; 
    s = s.replace(/[\-|\.|_]/g, "/"); 
    var dt = new Date(Date.parse(s)); 
    var arrDateParts = s.split("/"); 
    return (
     dt.getMonth() == arrDateParts[0]-1 && 
     dt.getDate() == arrDateParts[1] && 
     dt.getFullYear() == arrDateParts[2] 
    ); 
} 

console.log(isDate("abc 1")); // Will give false 

Работа Fiddle

+0

Простите, что консольный журнал возвращает true, а не false. –

+0

К сожалению, теперь просмотрите обновление. Рабочий скрипт http://jsfiddle.net/voidSO/kux0246j/. – void

+0

Если вы решите свою проблему, пожалуйста, подумайте о ее голосовании и отметьте ее как правильный ответ. – void

0

Было бы хорошо, если вы проверяете несколько типов дат?

вид этого для узкой на разрешенной дату:

if(givenDate.match(/\d\d\/\d\d\/\d\d\d\d/) 
|| givenDate.match(/\w*? \d{1,2} \d{4}/) 
|| givenDate.match(anotherFormatToMatch)) 

ОБНОВЛЕНО

Или althougt этого ограничения символов, вы coud использовать что-то вроде этого:

function myFunction() { 
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var date = new Date(str); 
    if (date != "Invalid Date" && !isNaN(new Date(date) && !str.match(/a-z/g)) 
     alert(date); 
} 
+0

Ваше первое решение ограничивает формат даты, а второй не решает основной проблемы. 'new Date (« hello 1 »)' является допустимой датой. –

+0

Да, я вижу, я сделал исправление, не могли бы вы попробовать? – chomsky

+0

Забудьте об этом, у него все еще есть проблемы. Я скажу вам, когда я получу его работу – chomsky

2

С вами используя метод time.js, попробуйте использовать parsingFlags():

var m = moment("hello 1", ["YYYY/MM/DD"]).parsingFlags(); 
if (!m.score && !m.empty) { 
    // valid 
} 

Это метрики, используемые для isValid(), и вы можете использовать их для более строгой проверки.

Примечание: Вы можете указать другие форматы, поддерживаемые в массиве второго аргумента.

Некоторые другие свойства, возвращаемые parsingFlags(), которые могут быть интересны следующие:

  • m.unusedInput - Исх. ["hello "]
  • m.unusedTokens - Исх. ["MM", "DD"]
+0

Это заставляет меня знать формат даты, поэтому не получится. Однако, потрясающая информация о материале parsingFlags, спасибо. –

+1

Хороший ответ. Благодаря :). –