regex, чтобы получить дату yyyy-mm-dd из любой строки

прежде всего, извините меня за то, что вы не знакомы с регулярным выражением. Что бы мне хотелось, это регулярное выражение, которое будет извлекать дату типа mysql из любого типа строки. До сих пор я использовал это: ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$

Однако теперь я хочу извлечь шаблоны дат из других строк и строк datetime, которые я попытался изменить регулярное выражение на ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]). основанный на некоторых онлайн-тестировщиках регулярных выражений, но он терпит неудачу. Также несколько раз это давало мне результат с 3-значным днем.

Другими словами, sting начинается с yyyy-mm-dd и сопровождается пробелами символов или что-то еще. Как извлечь дату?

ОБНОВИТЬ

Я тестирую regex с preg_match здесь: http://www.pagecolumn.com/tool/pregtest.htm

пока что единственная вещь, которая, кажется, работает

 [0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) 

Чтобы соответствовать датам, где бы они ни появлялись, удалите привязки $ и ^ из исходного исходного выражения.

Чтобы соответствовать датам в начале любого ввода, удалите $ в конце (оставьте ^ ).

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

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

Если в вашей строке указано более одного значения формы даты, и вы хотите их захватить, вы должны использовать preg_match_all и если это не preg_match , достаточно. Кроме того, использование ^ и $ означает, что входная строка должна быть просто датой, поэтому избегайте ее.

 <?php $input_string = "yes today is 2013-10-24"; if(preg_match("/\d{4}-\d{2}-\d{2}/", $input_string, $match)) { print_r($match); } else echo "not matched"; //////////////////////// /* Output: Array ( [0] => 2013-10-24 ) */ 

Демо-версия

Попробуйте это: вы можете использовать preg_match() или preg_match_all()

  $dateArray = preg_match("/(\d{4}-\d{2}-\d{2})/", $str, $match); 

Затем используйте strtotime и дату

 $date = date('Ym-d',strtotime($match[0])); 

Просто замените ^ для \b .

 \b(\d{4}-\d{2}-\d{2}) 

Это точка в конце вашего регулярного выражения (она соответствует любому символу, за исключением разрывов строк). Попробуйте удалить его

 ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])