php preg_match_all,在可用时返回多个可选值

时间:2011-02-09 18:10:55

标签: php regex expression preg-match-all

干草堆的例子:

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或者管理员剂量...

2 个答案:

答案 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上的人们完成工作