Intereting Posts

Найти комментарии по-разному в комментариях

У меня есть еще один вопрос для preg_match .

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

Я узнал, что комментарии и даты написаны так:

 +-------+----------------------+--------------+ | id | warning_sent | warning_date | +-------+----------------------+--------------+ | 6109 | 2011-06-28 | 0000-00-00 | | 6123 | 2012 02 14 | 0000-00-00 | | 6126 | Some text 18.11.10\n | 0000-00-00 | /* This is 2010-11-18 */ | 13750 | 2011-06-28\n | 0000-00-00 | | 8108 | 7-01-2010 | 0000-00-00 | | 9954 | 2012.07.03 | 0000-00-00 | | 6110 | Some text 21-02-2011 | 0000-00-00 | +-------+----------------------+--------------+ 

Теперь, единственное, о чем я мог думать (и знаю, как это сделать), ищет первое число, а затем и последнее. И как-то анализируя строку между ними, но это вызывает серьезную проблему, если текст комментария содержит номер сам по себе.

Итак, вопрос: как я могу найти все даты (есть только один в каждом комментарии) внутри комментариев и сохранить их автоматически внутри другого столбца в моем желаемом формате YYYY-MM-DD?

Изменить: это сработало, thanx @infinity

 $query = "SELECT id, warning_sent FROM data"; $result = qq( $query ); foreach( $result as $values ) { preg_match( '/[\d]{4}((-|\s|\.)[\d]{2}){2}|([\d]{1,2}(\.|-)){2}[\d]{2,4}/', $values['warning_sent'], $matches ); $old_date = $matches[0]; $new_date = '0000-00-00'; /* 2011-06-28, 2012 02 14, 18.11.10, 7-01-2010, 2012.07.03, 21-02-2011, 20.10.2010 */ $formattings = array( 'Ym-d', 'Y m d', 'dmY', 'dmy', 'jm-Y', 'Ymd', 'dmY' ); for( $k=0; $k<sizeof( $formattings ); $k++ ) { $sub_date = DateTime::createFromFormat( $formattings[$k], $old_date ); $sub_date = (array)$sub_date; $timestamp = strtotime( $sub_date['date'] ); $check_date = date( $formattings[$k], $timestamp ); if( $old_date == $check_date ) $new_date = date( 'Ym-d', $timestamp ); } $warning_sent_date[$values['id']] = $new_date; } 

Если у вас есть только эти 3 формата, которые должны работать

 '/[\d]{4}((-|\s|\.)[\d]{2}){2}|([\d]{1,2}(\.|-)){2}[\d]{2,4}/' 

Обновления RegEx

http://regexr.com?32pbf

Вы можете использовать preg_match для поиска строк с датами, встроенными в комментарии. Другие представили способы этого.

Однако MySQL не имеет встроенной функции для выполнения замещения регулярного выражения. Например, Oracle dbms предлагает REGEXP_REPLACE (см. Здесь: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm ), но MySQL не делает этого.

Таким образом, вам придется использовать код клиента для извлечения каждой строки с датой в поле комментария, извлечения даты и обновления строки. Это неприятность, а?