【发布时间】:2011-03-24 17:42:26
【问题描述】:
这是一个示例字符串:
---------
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() 并将 $matches 数组转换为更有用的数组的函数:
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] =>
)
)
所以我想要返回所有的军医信息(ID、角色和级别),但我不希望模式依赖于那里的任何一条信息 - 所以它应该返回军医,如果这些数据点中的任何一个都存在。
【问题讨论】:
-
只需在你的正则表达式中去掉换行符,即尾随
\n。您的最后一个数据行之后不一定有换行符,似乎是您的情况。 -
Array ( [0] => Array ( [ID] => PMD205304 [role] => PRIMARY [level] => ) [1] => Array ( [ID] => [role] => [level] => EMT-PARAMEDIC ) [2] => Array ( [ID] => EMT530755 [role] => OTHER [level] => EMT-BASIC ) ) -
这就是我得到的,它现在认为有3个医生
标签: php regex arrays preg-match-all