2011-02-09 22 views
1

實施例:PHP 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),有時「醫學管理路線:。 (H:MM AM/PM),途徑(靜脈注射,口服等)和劑量(口服劑量)等(如果有的話) 20.00 MG,2.00 L/MIN等)全部存儲在一個陣列中。我以爲我過去曾經擁有它,但是當我向它投擲不同的乾草堆時,它失敗了......另外請注意,有時會出現一個選項卡,而不是變量之間的空格,例如time-Admin或管理員劑量...

回答

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地感謝傢伙

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 
     ) 
) 

這裏唯一的問題是「醫療管理路線」位。它必須是一個單詞(即:沒有空格)。

+0

感謝您的快速答案,但我只能用這種模式獲得的名稱和時間......這是我從第一個獲得3個吃藥: '陣列 ( [0] =>數組 ( [名稱] =>精通 [時間] => 9:50 PM ) [1] =>數組 ( [名] =>利多卡因 [時間] => 9:50 PM ) [2] =>數組 ( [名稱] =>琥珀 [時間] => 9:50 PM ) )' – jreed121

+0

@ jreed121:這是奇怪,因爲它符合我的預期(我發佈的輸出是我得到的實際輸出)。在你的例子中可能存在一個轉折點,你輸入的數據是否與你發佈的數據完全相同? – netcoder

+0

是的,這是一樣的。這裏是一個包括我能想到的所有潛在組合的例子:' Med給出:Versed - 9:50 PM \t Med Admin Route:Intravenous \t劑量:20.00 MG Med給定:利多卡因 - 9:50 PM \t Med管理員路線:靜脈\t用量:150.00 MG 醫學鑑於:琥珀膽鹼 - 9:50 PM \t醫學管理路線:鼻塞\t用量:200.00 MG 醫學鑑於:萬古黴素\t醫學管理途徑:經口\t用量:20。00 MG 醫學鑑於:芬太尼twowords 醫學鑑於:多巴胺\t用量:200.00 MG 醫學鑑於:氧氣 - 下午7時23 \t用量:2.00升/分鐘 醫學鑑於:葡萄糖\t醫學管理路線:靜脈 醫學考慮:慶大黴素' – jreed121