干草堆的例子:
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
正如你所看到的,有时会有时间( - H:MM AM / PM),有时候“Med Admin Route:...”和“Dosage:...”,我总是想要这个名字(Versed,Oxygen)等,如果可用 - 时间(H:MM AM / PM),路线(静脉注射,口服等)和剂量(20.00 MG,2.00 L / MIN等)都存储在一个阵列中。我以为我过去曾经拥有它,但是当我扔掉一个不同的干草堆时它会失败...另外请注意,有时在变量之间有一个标签而不是空格,如time-Admin或者管理员剂量...
答案 0 :(得分:1)
幸运的是,在午休期间我有一些时间在我的手上:)
在正则表达式中,?
表达式后表示它将接受一次或零次出现。每个例子:
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”位。它必须是一个单词(即:没有空格)。
答案 1 :(得分:0)
preg_match_all('~Med Given: ((?:(?!-\s*\d{1,2}:\d{1,2} (?:A|P)M|Med Admin Route:|Dosage:|$).)+)(?:\s*-\s*(.*?(?:A|P)M))?(?:\s*Med Admin Route:((?:(?!Dosage:|$).)+))?(?:\s*Dosage:\s*(.*))?~',$content,$matches);
感谢phpfreaks.com上的人们完成工作