К счастью для вас, у меня есть немного времени во время моего обеденного перерыва:)
В регулярном выражении ?
после выражения означает, что оно примет один или ноль вхождений. За пример:
preg_match('/^(foo)?bar/', 'foobar'); // 1
preg_match('/^(foo)?bar/', 'bar'); // also 1
В вашем случае, это немного сложно сделать с помощью регулярных выражений, но в любом случае возможно:
preg_match_all('/Med Given: (?<name>[A-Za-z ]+)(- (?<time>[0-9:]+ (AM|PM)))?( +Med Admin Route: (?<route>\w+))?( +Dosage: (?<dosage>.*))?/', $data, $matches);
Затем постобработка массива:
$result = array();
foreach ($matches['name'] as $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);
Это должно дать вам:
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
)
)
Единственная проблема здесь - бит "Med Admin Route". Это должно быть одно слово (т.е. без пробелов).