@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. В регулярных не силен, к сожалению, можно ли ими сделать "универсальное" для данного случая решения?
  • Вопрос задан
  • 208 просмотров
Решения вопроса 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";
  }
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы