我有以下数据
<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。
任何关于处理这件事的最佳方法的建议都很感激。
谢谢
发布于 2015-03-23 13:53:09
您可以使用\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})
你必须将每一场比赛的第一组和第二组组合起来才能得到航班号,然后第三组应该被分割成一个数组来获得座位阵列。所以,您不必运行相同的正则表达式两次。
输出:
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 Y7https://stackoverflow.com/questions/29211549
复制相似问题