PHP Regex从String获取数据并将其放入数组


PHP Regex getting data from String and into array

我有以下数据

<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。

任何关于处理这件事的最佳方法的建议都将不胜感激。

感谢

您可以将'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})

你必须将每场比赛的第一组和第二组组合起来才能获得航班号,然后将第三组分成一个数组才能获得座位数组。因此,您不必两次运行相同的regex。

输出:

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 Y7