2011-03-24 28 views
1

下面是一个样本串:PHP preg_match_all() - 我的正则表达式出了什么问题?

--------- 
SAY WHAAAAT 
MEDICS: 
CREW ID: PMD205304 CREW MEMBER ROLE: PRIMARY PATIENT CAREGIVER CREW MEMBER LEVEL: EMT-PARAMEDIC 
CREW ID: EMT530755 CREW MEMBER ROLE: OTHER CREW MEMBER LEVEL: EMT-BASIC 

这是执行preg_match_all()和平移$匹配阵列分成更可用阵列的功能:

 private function getMedics(){ 
     if(isset($this->record->elements["E04"])){ 
       //REGEX: 
       $ptn = "/(?:CREW ID: (.+?))*(?:CREW MEMBER ROLE: (.+?)\s+)*(?:CREW MEMBER LEVEL: (.+))?\n/"; 
       $str = $this->record->incidentRow['Narrative']; //Column where medic info is stored in CodeZoneIncidents table 
       preg_match_all($ptn,$str,$matches); 
       foreach($matches as $key => $val){ 
        foreach($matches[$key] as $key2 => $val2){ 
         if(trim($val2) != ""){ 
          $tmp[$key2]['ID'] = $matches[1][$key2]; 
          $tmp[$key2]['role'] = $matches[2][$key2]; 
          $tmp[$key2]['level'] = $matches[3][$key2]; 
         } 
        } 
       } 
       $ii = 0; 
       foreach($tmp as $key => $val){ 
        $CZMedics[$ii]['ID'] = $tmp[$key]['ID']; 
        $CZMedics[$ii]['role'] = $tmp[$key]['role']; 
        $CZMedics[$ii]['level'] = $tmp[$key]['level']; 
        $ii++; 
       } //REGEX pattern 

       $iterations = $this->eleQTY($this->record->elements["E04"]); //Return how many E04 there are 
       for($i=0; $i<$iterations; $i++){ 
        //[E04][0] if there are multiples: 
        $tmpEle = (isset($this->record->elements["E04"][$i])?$this->record->elements["E04"][$i]:$this->record->elements["E04"]); 
        //Populate Actual values: 
        if(isset($tmpEle["E04_01"]->code)){ 
          $tmpEle["E04_01"]->actual = fncIsSet($CZMedics[$i]['ID']); //Medic ID 
          $tmpEle["E04_01"]->CZCellName = "Narrative_Box"; //CZPopUp Box 
        } 
        if(isset($tmpEle["E04_02"]->code)){ 
          $tmpEle["E04_02"]->actual = fncIsSet($CZMedics[$i]['role']); //Role 
          $tmpEle["E04_02"]->CZCellName = "Narrative_Box"; //CZPopUp Box 
        } 
        if(isset($tmpEle["E04_03"]->code)){ 
          $tmpEle["E04_03"]->actual = fncIsSet($CZMedics[$i]['level']); //Level 
          $tmpEle["E04_03"]->CZCellName = "Narrative_Box"; //CZPopUp Box 
        } 
       } 
       echo "<pre style='display:none;'>!!!"; 
       print_r($CZMedics); 
       echo "</pre>"; 
     }  
    } 

这里是所得到的数组:

Array 
(
    [0] => Array 
     (
      [ID] => PMD205304 
      [role] => PRIMARY PATIENT CAREGIVER 
      [level] => EMT-PARAMEDIC 
     ) 

[1] => Array 
    (
     [ID] => 
     [role] => 
     [level] => 
    ) 

所以w ^我想要的帽子是返回所有的医疗信息(ID,角色&等级),但我不希望该模式依赖任何一个信息在那里 - 所以它应该返回医生,如果其中任何一个数据点存在。

+1

就扔掉换行符在你的正则表达式,即尾随'\ N'。你最后的数据行后面不一定有换行符,似乎是你的情况。 – erisco 2011-03-24 17:52:51

+0

'阵列 ( [0] =>数组 ( [ID] => PMD205304 [作用] => PRIMARY [等级] => ) [1] =>数组 ( [ID] => [作用] => [等级] => EMT-护理人员 ) [2] =>数组 ( [ID] => EMT530755 [作用] => OTHER [等级] => EMT -BASIC ) ) ' – jreed121 2011-03-24 18:01:04

+0

这就是我所得到的,现在认为有3名医务人员 – jreed121 2011-03-24 18:01:50

回答

1

您几乎可以使用名为捕捉组消除了手动循环分配:

preg_match_all('~^(?=CREW)(CREW ID: (?P<id>\w+))?\s*(CREW MEMBER ROLE: (?<role>.*?))?\s*(CREW MEMBER LEVEL: (?<level>.*?))?$~mi', $text, $match, PREG_SET_ORDER); 

这将导致许多extranous项,但[id][role][level]已经分离出来(当然你也可以重新添加?:减少杂波):

[0] => Array 
    (
     [0] => CREW ID: PMD205304 CREW MEMBER ROLE: PRIMARY PATIENT CAREGIVER CREW MEMBER LEVEL: EMT-PARAMEDIC 
     [1] => CREW ID: PMD205304 
     [id] => PMD205304 
     [2] => PMD205304 
     [3] => CREW MEMBER ROLE: PRIMARY PATIENT CAREGIVER 
     [role] => PRIMARY PATIENT CAREGIVER 
     [4] => PRIMARY PATIENT CAREGIVER 
     [5] => CREW MEMBER LEVEL: EMT-PARAMEDIC 
     [level] => EMT-PARAMEDIC 
     [6] => EMT-PARAMEDIC 
    ) 
+0

如果所有的值都是可选的,这是否可以工作? ID,角色和级别 - 只需要有一个(任何一个),就无法确定是否提供了任何字段。 – jreed121 2011-03-24 18:18:37

+0

是的。但每个组后面都有一个'?',所以它可以返回空的结果块。你将不得不检查是否存在'[id],[角色]或[级别]' – mario 2011-03-24 18:21:34

+0

如果ID不存在,这是行不通的,有什么建议吗? – jreed121 2011-03-24 18:22:32

1

这应该做的伎俩:

^CREW ID:CREW成员角色(*):船员LEVEL(*):(。*)$

至少它为例子你提供。但是“。+?”和字段之间的星号“*”可能意味着您希望它们是可选的,或者您希望允许多个字段。所以,也许你需要提供更多的例子...

顺便说一句:如果你想确保线匹配完全使用^ $。并激活允许^ $匹配换行符的选项。我#宁可不使用“\ n”

+0

您至少需要使用。*?否则它会很贪婪并且匹配下一个字段的标签。 – erisco 2011-03-24 18:14:09

+0

是的,所有三个数据点都是可选的 - 只需要一个。 – jreed121 2011-03-24 18:15:19