PHP从字符串中获取某些数据

时间:2015-03-22 23:04:40

标签: php regex string

我有以下数据

<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表示我传递的每个Text元素。这就是我所知道的。主行总是以数字开头,这就是我在做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时,我如何处理它的数字部分,它可以附加到航班号,但也可以用一个或多个空格分隔?

任何指导意见。

1 个答案:

答案 0 :(得分:1)

如果您要求使用正则表达式解决方案,可以尝试this regex

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

(?<=<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`