Задать вопрос
@Richard_Ferlow
Веб-программист

Как распарсить строки, если формат «плавающий»?

Текст авиабилета разбил на строки. Получается каждый "сегмент" перелета из двух строк состоит.
Нужно из каждого сегмента получить даты отправления, время отправления, код города отправления, код города прибытия, время прибытия и дату прибытия(ее может не быть если совпадает с датой отправления".

[17] => 20NOV S7 873   OVB-NOVOSIBIRSK         2355  PEK-CAPITAL-BEIJING     V -OK  1PC
    [18] =>                TERMINAL B                    TERMINAL 3      ARRIVAL:0510 21NOV
    [19] => 21NOV MU 5183  PEK-CAPITAL-BEIJING     0725  PVG-PU DONG-SHANGHAI    S -OK  1PC
    [20] =>                TERMINAL 2                    TERMINAL 1      ARRIVAL:0955      
    [21] => 25NOV HU 7620  PVG-PU DONG-SHANGHAI    2205  PEK-CAPITAL-BEIJING     Y -OK  1PC
    [22] =>                TERMINAL 2                    TERMINAL 1      ARRIVAL:0035 26NOV
    [23] => 26NOV S7 874   PEK-CAPITAL-BEIJING     0605  OVB-NOVOSIBIRSK         T -OK  1PC
    [24] =>                TERMINAL 3                    TERMINAL B      ARRIVAL:0955


Задумался несколько. Если бы все города писались в одно слово без пробелов, я бы сделал просто через explode(" ", $var)
но все сложнее увы...как быть? сами названия городов не нужны, т.е. из строчек PEK-CAPITAL-BEIJING и PVG-PU DONG-SHANGHAI важны только IATA коды - PEK и PVG. В регулярных не силен, к сожалению, можно ли ими сделать "универсальное" для данного случая решения?
  • Вопрос задан
  • 211 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Denormalization
@Denormalization
preg_match("/(?<![A-Z])\s([A-Z]{3})-/Uig", $text, $matches); // для кодов
preg_match("/([0-9]{2}[A-Z]{3})/Uig", $text, $matches); // для дат
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Все данные в фиксированных позициях, достаточно простого substr(). Но можно и регуляркой
if (preg_match_all('/(\d\d)(\S{3})\s+\S+\s+\d+\s+(\S{3})-.*?(\d\d)(\d\d)\s+(\S{3})-.*?ARRIVAL:(\d\d)(\d\d)(?: (\d\d)(\S{3}))?/s', 
    $data, $matches, PREG_SET_ORDER)) {
  foreach($matches as $flight) {
    if (!isset($flight[9])) {
        $flight[9] = $flight[1];
        $flight[10] = $flight[2];
    }
    list($full, $depDay, $depMonth, $depIATA, $depHour, $depMin,
         $arrIATA, $arrHour, $arrMin, $arrDay, $arrMonth) = $flight;
    print "$depDay $depMonth $depHour:$depMin $depIATA => $arrDay $arrMonth $arrHour:$arrMin $arrIATA\n";
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽