我有如下数据
<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时,我该如何处理它的数字部分,它可以附加到航班号上,但也可以用一个或多个空格分隔?
任何指导表示赞赏。
如果您需要正则表达式解决方案,您可以尝试这个正则表达式
\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`
如果您要扫描文件的行,
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',
)