解析多语言航班信息日志并提取可能以空格分隔的航班号

问题描述 投票:0回答:2

我有如下数据

<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时,我该如何处理它的数字部分,它可以附加到航班号上,但也可以用一个或多个空格分隔?

php regex string text-extraction text-parsing
2个回答
1
投票

如果您需要正则表达式解决方案,您可以尝试这个正则表达式

\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`

0
投票

如果您要扫描文件的行,

fscanf()
可能是一个不错的选择。 为了在线演示,我将展示一个进行迭代
sscanf()
调用的脚本。

匹配,但不要捕获

#
之前的字符,然后匹配带有尾随空格的字母,然后是数字。 如果该行中有 3 个匹配项,则将右侧修剪并连接的值推入结果数组中。

代码:(演示

$log = <<<LOG
<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>
LOG;

$result = [];
foreach (explode("\n", $log) as $line) {
    if (sscanf($line, '<terminal:Text>%*[^#]#%[^0-9]%d', $letters, $digits) === 3) {
        $result[] = rtrim($letters) . $digits;
    }
}
var_export($result);

输出:

array (
  0 => 'VS5',
  1 => 'IB4637',
  2 => 'AA57',
)
© www.soinside.com 2019 - 2024. All rights reserved.