Распарсить время

Тема в разделе "Регулярные выражения", создана пользователем Genk0, 7 янв 2015.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Genk0

    Genk0 Инквизитор из раздела J!

    Moderator
    Регистр.:
    2 июн 2010
    Сообщения:
    1.645
    Симпатии:
    1.349
    Есть строки вида:
    Сб 31 января, 19:00
    Вс 25 января, 11:00, 14:00
    Пт 30 января, 17:00, Сб 31 января, 11:00, 14:00
    Пт 30 января, 17:00, Сб 31 января, 11:00, 14:00, Вс 25 января, 11:00, 14:00
    т.е. от 1 до 3-5 дат, с 1 и более указанием времени.
    Нужно получить массив каждого дня с его временем
    1. ['30 января']=>['17:00'];
    2. ['30 января']=>['17:00'], ['31 января']=>['11:00, '14:00''], ...
    3. ['25 января']=>['11:00, 14:00'], ['30 января']=>['17:00'], ['31 января']=>['11:00, '14:00''], ...
     
  2. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    194
    Тут простой регуляркой не справиться.
    1. Разбить по запятым.
    2. Разбить по строкам.
    3. Объединить массивы 1 и 2.
    4. Цикл по массиву — если нет даты, то надо брать предыдущую
    5. Собрать всё.

    Возможно и регуляркой можно, но тут не простая регулярка, Перейти по ссылке:
    В проверках, к сожалению, вообще не силён.
     
    Последнее редактирование: 8 янв 2015
  3. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    205
    Симпатии:
    259
    Перейти по ссылке
    PHP:
    $str '
    Сб 31 января, 19:00
    Вс 25 января, 11:00, 14:00
    Пт 30 января, 17:00, Сб 31 января, 11:00, 14:00
    Пт 30 января, 17:00, Сб 31 января, 11:00, 14:00, Вс 25 января, 11:00, 14:00
    '
    ;

    preg_match_all('~\S{2} (\d{2} \S+), (\d{2}:\d{2}(?:, \d{2}:\d{2})*)~u'$str$matchPREG_SET_ORDER);


    print_r($match);

    $result = array();
    foreach(
    $match as $m)
    {
      
    $result[$m[1]] = explode(', '$m[2]);
    }

    print_r($result);
     
    Genk0 нравится это.
Статус темы:
Закрыта.