我有如下数据
<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等)。首先,我需要航班号码。
航班号总是以#开头。航空公司的代码总是两个大写字母,航班号可以是1-4位数字.所以有了上面这些,我可以做一些类似的事情
$pat = strpos($flightInfo, "#");这样我就能知道每个航班的开始了。这里是棘手的部分,航班号与上面的例子不一样。第一个是VS,然后是2个空格,然后是5个(所以VS5)。第二个是直进式,它是所有的集合(IB4637)。最后一个是AA,然后是2个空间,然后是57 (AA57)。有时只有一个空间。
因此,航空公司代码将始终附加到#上,我知道它的长度总是2,所以为了得到它,我可以做一些类似的事情
$fltcode = substr($flightInfo, $pat+1, 2);我的主要问题是,我如何处理它的数字部分,当它可以是1-4的长度,它可以附加到航班号码,但它也可以分开一个或多个空间?
任何指导都很感激。
发布于 2015-03-22 23:20:09
如果您请求regex解决方案,可以尝试这个判据。
\d+[^#]*\#(\p{Lu}{2})\s*(\d{1,4})\b
或
(?<=<terminal:Text>)\d+[^#]*\#(\p{Lu}{2})\s*(\d{1,4})\b (如果元素节点位于文本节点前面)
基本上,它捕获两个组的航班号,包括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`https://stackoverflow.com/questions/29200940
复制相似问题