我有以下数据
<terminal:Text>1 #VS 5 J9 C9 D9 I9 Z9 W9 S9 H9 LHRMIA 1235 1705 744 0E</terminal:Text>
<terminal:Text>2 #IB4637 F9 A9 J9 C9 D9 R9 I. W9 LHRMIA 1415 1825 * 744 0E</terminal:Text>
<terminal:Text>3*O#AA 57 F7 A7 P7 J7 R7 D7 I7 Y7 LHRMIA 0945 1415 777 0E</terminal:Text>
我现在已经成功获得了以#开头、包含2个大写字母和1-4位数字的航班号,例如(VS5)。为了做到这一点,我做了
while ($elNum < $elements->length) {
$flightInfo = $elements->item($elNum)->nodeValue;
if(preg_match('/'d+[^#]*'#('p{Lu}{2})'s*('d{1,4})'b/', $flightInfo, $matches ) === 1){
$fltCode = $matches[0];
$this->flights[] = array(
"flightNumber" => $fltCode
);
}
++$elNum;
}
$elements表示一个元素,所以我循环其中的每一个,找到以数字开头的行,然后将航班号提取到我的数组中。
现在,我需要获得所有的座位/可用性,这些座位是航班号后面的字母/数字组合,例如J9、C9、D9等。
因此$flightInfo包含一行的所有数据。现在真的,我在想,现在我有了所有的航班号,我应该把它们从$flightInfo字符串中去掉?
我的主要问题是如何在我的航班阵列中获得每一排的座位/可用性?我应该做另一个if语句吗?我唯一的问题是,字符串中可能有另一个字母/数字组合,可能与此部分无关。我所知道的是,我需要的是在航班号之后,六个大写字母之前,例如LHRMIA。
任何关于处理这件事的最佳方法的建议都将不胜感激。
感谢
您可以将'K
运算符与Perl/PCRE正则表达式一起使用,并向前看以检查是否有6个大写字母:
$re = "/''d+[^#]*''#''p{Lu}{2}''s*''d{1,4}''b''s*''K[''w ]+(?=''s+''p{Lu}{6})/";
这将返回作为完整匹配的J9 C9 D9 I9 Z9 W9 S9 H9
,并且只使用空格进行拆分。
样本代码:
$subject = "<terminal:Text>1 #VS 5 J9 C9 D9 I9 Z9 W9 S9 H9 LHRMIA 1235 1705 744 0E</terminal:Text>";
$pattern = '/''d+[^#]*''#''p{Lu}{2}''s*''d{1,4}''b''s*''K[''w ]+(?=''s+''p{Lu}{6})/';
preg_match($pattern, $subject, $matches);
$arrayOfSeats = explode(" ", $matches[0]);
print_r($arrayOfSeats);
输出:
Array
(
[0] => J9
[1] => C9
[2] => D9
[3] => I9
[4] => Z9
[5] => W9
[6] => S9
[7] => H9
)
编辑:
转念一想,我认为您甚至可以用1个regex:初始化所有数组
(?<=<terminal:Text>)'d+[^#]*?'#('p{Lu}{2})'s*('d{1,4})'b's*(['w. ]+?)(?='s+'p{Lu}{6})
你必须将每场比赛的第一组和第二组组合起来才能获得航班号,然后将第三组分成一个数组才能获得座位数组。因此,您不必两次运行相同的regex。
输出:
Match 1:
Group1: VS
Group2: 5
Group3: J9 C9 D9 I9 Z9 W9 S9 H9
Match 2:
Group1: IB
Group2: 4637
Group3: F9 A9 J9 C9 D9 R9 I. W9
Match 3:
Group1: AA
Group2: 57
Group3: F7 A7 P7 J7 R7 D7 I7 Y7