PHP получает определенные данные из строк

У меня есть данные, подобные следующим

<terminal:Text>1  #VS   5 J9 C9 D9 I9 Z9 W9 S9 H9 LHRMIA 1235 1705      744 0E</terminal:Text>
<terminal:Text>        K9 Y9 B9 R9 L9 U9 M9 E9 Q9 X9 N9 O9 </terminal:Text>
<terminal:Text>2  #IB4637 F9 A9 J9 C9 D9 R9 I. W9 LHRMIA 1415 1825   *  744 0E</terminal:Text>
<terminal:Text>        Z. Y9 B9 H9 K. M. L. V. S. N. Q. O.</terminal:Text>
<terminal:Text>3*O#AA  57 F7 A7 P7 J7 R7 D7 I7 Y7 LHRMIA 0945 1415      777 0E</terminal:Text>
<terminal:Text>        B7 H7 K7 M7 L7 V7 G7 S7 Q7 N7 O7 </terminal:Text>

Я пытаюсь найти лучший способ разделения этих данных, чтобы получить нужные мне данные. Для начала делаю следующее

$elNum = 0;

while ($elNum < $elements->length) 
{
    $flightInfo = $elements->item($elNum)->nodeValue;

    if ( preg_match('/^\\d/', $flightInfo ) === 1 )
    {

        ++$elNum;
    }
}

$elements представляет каждый текстовый элемент, который я ему передаю. Вот что я знаю. Основная строка всегда начинается с цифры, поэтому я использую preg_match. Строка, следующая за строкой, начинающейся с цифры, связана с предыдущей строкой. По сути, в приведенном выше примере для каждого рейса есть две строки.

Я думал о том, чтобы взорвать ряд на местах, но я мог бы сделать это, когда дело доходит до мест (J9, M., I7 и т. д.). Для начала мне нужны номера рейсов.

Номер рейса всегда начинается с #. Код авиакомпании всегда состоит из 2 заглавных букв, номер рейса может состоять из 1-4 цифр. Итак, с вышеизложенным я мог бы сделать что-то вроде

$pat = strpos($flightInfo, "#");

Это приведет меня к началу каждого номера рейса. Вот хитрая часть, номера рейсов не такие, как в примере выше. Первый - VS, затем 2 пробела, а затем 5 (таким образом, VS5). Второй прямолинейный, все вместе (IB4637). Последний - AA, затем 2 пробела, а затем 57 (AA57). Иногда есть только одно место.

Таким образом, код авиакомпании всегда будет прикреплен к #, и я знаю, что его длина всегда равна 2, поэтому, чтобы получить его, я мог бы сделать что-то вроде

$fltcode = substr($flightInfo, $pat+1, 2);

Мой главный вопрос заключается в том, как я могу обрабатывать числовую часть, когда она может иметь длину от 1 до 4, она может быть прикреплена к номеру рейса, но также может быть разделена одним или несколькими пробелами?

Любое руководство приветствуется.


person Nick Price    schedule 22.03.2015    source источник


Ответы (1)


Если вам требуется регулярное выражение, вы можете попробовать это регулярное выражение

\d+[^#]*\#(\p{Lu}{2})\s*(\d{1,4})\b

or

(?<=<terminal:Text>)\d+[^#]*\#(\p{Lu}{2})\s*(\d{1,4})\b (если узел элемента находится перед текстовым)

По сути, он фиксирует номер рейса в 2 группах, состоящих из 2 прописных букв и от 1 до 4 цифр, которые необходимо сложить.

Выход:

MATCH 1
1.  [4-6]   `VS`
2.  [9-10]  `5`
MATCH 2
1.  [113-115]   `IB`
2.  [115-119]   `4637`
MATCH 3
1.  [221-223]   `AA`
2.  [225-227]   `57`
person Wiktor Stribiżew    schedule 22.03.2015
comment
Работает отлично, просто изучаю его сейчас, чтобы понять, что он делает. Спасибо за помощь - person Nick Price; 23.03.2015