regex - php preg_match_all, returning multiple optional values when available -
example of haystack:
interventions: --------------------- med given: versed - 9:50 pm med admin route: intravenous    dosage: 20.00 mg med given: lidocaine - 9:50 pm  med admin route: intravenous    dosage: 150.00 mg med given: succinylcholine - 9:50 pm    med admin route: intravenous    dosage: 200.00 mg med given: oxygen - 7:23 pm dosage: 2.00 l/min med given: vancomycin med given: fentanyl med given: dopamine med given: dextrose med given: gentamicin   as cans see, there times ( - h:mm am/pm), "med admin route: ..." , "dosage: ...", want name (versed, oxygen, etc) , if available - time (h:mm am/pm), route (intravenous, oral, etc) , dosage (20.00 mg, 2.00 l/min, etc) stored in array. i've thought i've had in past when throw different haystack @ it fails... note appears there tab instead of space between variables time-admin or admin-dosage...
luckily you, have time on hands during lunch break :)
in regex, ? after expression means accept 1 or 0 occurences. per example:
preg_match('/^(foo)?bar/', 'foobar'); // 1 preg_match('/^(foo)?bar/', 'bar');    // 1   in case, little hard regex, feasible anyway:
preg_match_all('/med given: (?<name>[a-za-z ]+)(- (?<time>[0-9:]+ (am|pm)))?( +med admin route: (?<route>\w+))?( +dosage: (?<dosage>.*))?/', $data, $matches);   then post-process array:
$result = array(); foreach ($matches['name'] $key => $name) {     $result = array('name'=>$name);     if (!empty($matches['time'][$key])) $result['time'] = $matches['time'][$key];     if (!empty($matches['route'][$key])) $result['route'] = $matches['route'][$key];     if (!empty($matches['dosage'][$key])) $result['dosage'] = $matches['dosage'][$key];     $results[] = $result; } print_r($results);   this should give you:
array (     [0] => array         (             [name] => versed              [time] => 9:50 pm             [route] => intravenous             [dosage] => 20.00 mg         )     [1] => array         (             [name] => lidocaine              [time] => 9:50 pm             [route] => intravenous             [dosage] => 150.00 mg         )     [2] => array         (             [name] => succinylcholine              [time] => 9:50 pm             [route] => intravenous             [dosage] => 200.00 mg         )     [3] => array         (             [name] => oxygen              [time] => 7:23 pm             [dosage] => 2.00 l/min         )     [4] => array         (             [name] => vancomycin         )     [5] => array         (             [name] => fentanyl         )     [6] => array         (             [name] => dopamine         )     [7] => array         (             [name] => dextrose         )     [8] => array         (             [name] => gentamicin         ) )   the issue here "med admin route" bit. must single word (i.e.: no spaces).
Comments
Post a Comment