Простейшая регулярка

krafty

new Exception
еще немного флуда :) вот работоспособный вариант
$dt_elements = explode('-',$str);
if ((preg_match('/^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$/',$str))and
(checkdate($dt_elements[1],$dt_elements[2],$dt_elements[0])))
echo 'Правильный формат даты';
else echo 'Неправильный формат даты';

-~{}~ 02.09.05 17:45:

Ринат
>имхо попробовать напистаь регулярку и проверять
как проверять? без чекдэйт, все на регах
 

Ринат

Новичок
импровизация, ни в коей мере не претендует на исключительность и абсолюную правильность
PHP:
preg_match("/^([1-2]{1}[0-9]{1}[0-9]{1}[0-9]{1})-([0,1]{1}[0-2]{1})-([0-3]{1}[0-9]{1})$/", $string)
хотя 00-00 прокатит
по твоему варианту preg_split
 

python

Новичок
Оторопь берет :)
Так не пробовали?
PHP:
function callb_func($matches) {
  if (!count($matches))
    return '';
    
  if (!checkdate($matches[2], $matches[3], $matches[1]))
    return '';
    
  return $matches[0];
}

function checkdate_string($str) {
  return (preg_replace_callback('/^([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})$/', "callb_func", $str)===$str);
}
 

Фанат

oncle terrible
Команда форума
оторопь берёт.
это круче, чем две строчки с эксплодом ичекдейтом?
 

Фанат

oncle terrible
Команда форума
я понимаю.
есть много извращенцев
однако обычно эти люди стараются держаться скромнее и не афишировать свои позорные пристрастия.
 

python

Новичок
я понимаю.
есть много людей, которые считают себя лучше/умнее других
и обычно эти люди не стараются держаться скромнее, а афишируют свои позорные пристрастия
 

krafty

new Exception
python
конкретизируй. если это камень в мою сторону, то буду защищаться.
Фанат
я надеюсь, ты извращенцами называешь не тех людей, которые пока недостаточно знают и не имеют опыта и только по этим причинам пишут нерациональные (или "флудные") строчки кода
 

Фанат

oncle terrible
Команда форума
нет, это камень не в твою сторону.
объясни лучше, зачем в этом коде
$dt_elements = explode('-',$str);
if ((preg_match('/^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$/',$str))and
(checkdate($dt_elements[1],$dt_elements[2],$dt_elements[0])))
preg_match?
 

krafty

new Exception
теперь уже понимаю, что незачем. с поставленной задачей вполне справится чекдейт напару с эксплод. но еще вчера я так не думал. есть и положительный момент: возник повод (хоть и неоправданный) в первый раз обратиться к регулярным выражениям.
еще по-поводу флуда в этой теме. разве не бывает так, что ставишь задачу и предлагаешь один метод решения, а потом в процессе обсуждения оказывается, что подходит совершенно другой метод. да - это флуд, но он естественный, правильный и вполне закономерный. поэтому с уважаемым python'ом, который так панически заботится об отсутствии оффтопиков (похлеще чем сами админы), я не согласен
 

Фанат

oncle terrible
Команда форума
он не заботится об отсутствии оффтопиков.
да и вообще не стоит обсуждать личности
вот я, например - неправильно поступил, когда так сделал.

на самом деле, регулярка, теоретически, может пригодится.
для такого, скажем, фантастического случая, когда дата будет иметь вид
2004лошади-22всадника-2командир.
chеckdate такую дату пропустит

-~{}~ 03.09.05 14:45:

хотя конечно же, эту задачу решит и простой
return (int)$dt_elements[1].'-'.(int)$dt_elements[2].'-'.(int)$dt_elements[0])))
 

krafty

new Exception
>2004лошади-22всадника-2командир.
>chеckdate такую дату пропустит
ну вот! я этого не знал (т.к. не проверял этот фантастический случай)
все-таки есть смысл в дополнительной проверке (пусть даже без помощи preg_match)
 

Ринат

Новичок
простите, возможно тема исчерпана, но стал интересен момент, описанный Фанатом, а именно
для такого, скажем, фантастического случая, когда дата будет иметь вид
2004лошади-22всадника-2командир.
chеckdate такую дату пропустит
написал функцию (огромная просьба подкорректировать, если что не так), ну так, если дата наподобие
2004лошади-22всадника-2командир., у меня выводи Warning (параметр длиннее, чем ожидается), соответственно дату не возвращает
функция
PHP:
function check_date($delimiter, $date) {
 if (isset($date) && !empty($date)){
	$pattern = "/[".$delimiter."]/";
	$date_array=preg_split($pattern, $date, 3);
		if(checkdate($date_array[1], $date_array[0], $date_array[2])) {
			return $date;
		}
	}
}
 

Фанат

oncle terrible
Команда форума
непонятно, зачем тут isset
да и empty - тоже
а так же - зачем нужен preg_split
и как обходится прописанная проблема.

а в остальном - отлично! =)
 

Ринат

Новичок
да иссет и эмпти лишние...100% так, нет просто дату типа 20лошади-12всадника-2004командир не возвращает,тогда как 20-12-2004 проходит как надо...может не понимаю ... по поводу preg_split.. решил попробовать, вместо эксплода, раньше не пробовал просто
но в любом случае спасибо!
 

Фанат

oncle terrible
Команда форума
не понял, а почему она не должна возвращать плохую дату?
 

Ринат

Новичок
я к тому, что как мне показалось
для такого, скажем, фантастического случая, когда дата будет иметь вид
2004лошади-22всадника-2командир.
chеckdate такую дату пропустит
в смысле checkdate ругается на такую дату, не пропустит =))
 

python

Новичок
krafty
камень был запущен в космос... :)
не хотел никого обидеть...
 
Сверху