首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP从字符串中获取数据并进入数组

PHP从字符串中获取数据并进入数组
EN

Stack Overflow用户
提问于 2015-03-23 13:30:52
回答 1查看 78关注 0票数 1

我有以下数据

代码语言:javascript
复制
<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)。为了做这件事我已经做了

代码语言:javascript
复制
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。

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-23 13:53:09

您可以使用\K运算符和Perl/PCRE以及一个正面的前瞻来检查确切的6个大写字母:

代码语言:javascript
复制
$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作为一个完整的匹配,并且只与空格分割。

样本代码:

代码语言:javascript
复制
$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);

输出

代码语言:javascript
复制
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})

你必须将每一场比赛的第一组和第二组组合起来才能得到航班号,然后第三组应该被分割成一个数组来获得座位阵列。所以,您不必运行相同的正则表达式两次。

输出:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29211549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档