php preg_match_all, возвращающий несколько необязательных значений, когда они доступны - PullRequest
1 голос
/ 09 февраля 2011

Пример стога сена:

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 и т. д.) и, если доступно, время (Ч: ММ AM / PM), маршрут (внутривенно, орально и т. д.) и дозировка (20,00 мг, 2,00 л / мин и т. д.) - все они хранятся в массиве Я думал, что у меня это было в прошлом, но когда я добавляю в него другой стог сена, это терпит неудачу ... Также обратите внимание, что иногда появляется вкладка вместо пробела между переменными, такими как time-Admin или Admin-Лекарственная ...

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

К счастью для вас, у меня есть немного времени во время моего обеденного перерыва:)

В регулярном выражении ? после выражения означает, что оно примет один или ноль вхождений. За пример:

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". Это должно быть одно слово (т.е. без пробелов).

0 голосов
/ 03 марта 2011
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

...