2012-07-29 37 views
1

我想解析一個文件,並將它存儲到ArrayPHP中。但是,應遵守一些規則:正則表達式php來解析文件

  • (p =「value」)應該被忽略,但應該保留"value"
  • -應該被忽略。
  • 空格應該被忽略。
  • 除以\t\n

樣本字符串爲:

NPD4196-2a_5_0 
Geldanamycin - 0.166516 (p = 0.0068) Alamethicin - 0.158302 (p = 0.0206)  4-Hydroxytamoxifen - 0.1429 (p = 0.0183)  Abietic acid - 0.133045 (p = 0.0203) Caspofungin - 0.130885 (p = 0.0432)  Extract 00-303C - 0.12858 (p = 0.0356) U73122 - 0.113274 (p = 0.0482) Radicicol - 0.10213 (p = 0.0356)  Calcium ionophore - 0.096183 (p = 0.0262) 

所以,我們的目標是產生類似的數據結構:

Array('NPD4196-2a_5_0' => Array(Array(0 => 'Geldanamycin', 1 => '0.166516', 2 => '0.0068'), Array(...)); 

我有這個迄今爲止寫的...

while(($line = fgets($fp)) !== false){ 
     $args = preg_split('/[\t\n (=) ]+/', $line, -1, PREG_SPLIT_NO_EMPTY); 
     if(count($args)){ 
      print_r($args); 
      print "\n"; 
     } 
} 

我在其他方面錯過了什麼來完成我的目標? 由於

回答

1

這似乎適用於一個鍵值對(假設NPD4196-2a_5_0是您的示例中的關鍵字,而第二行是值)。

<?php 

$fp = fopen('foo.txt', 'r'); 
$regex = '/(\w*)\s*-\s*([\d\.]+)\s*\(p\s*=\s*([\d\.]+)\)/'; 
$id = "NO ID"; 
$result = Array(); 

while(($line = fgets($fp)) !== false){ 
    if (!preg_match($regex, $line)) { 
     $id = chop($line); 
    } else { 
     $all = Array(); 

     while (preg_match($regex, $line, $matches, PREG_OFFSET_CAPTURE)) { 
      $last = end($matches); 
      $line = substr($line, $last[1] + strlen($last[0]) + 1); 

      $strings = Array(); 

      for ($i = 1; $i < 4; $i++) { 
       array_push($strings, $matches[$i][0]); 
      } 

      array_push($all, $strings); 
     } 

     $result[$id] = $all; 
    } 
} 

print_r($result); 
?> 

(這是大衛B的正則表達式的稍微改動過的版本。)

如果該行不那麼久正則表達式匹配模式,它將存儲行的ID。否則,它將匹配RegEx,然後切掉匹配的部分。 inner while循環的每次迭代都將匹配一個條目。由於我抓取匹配的索引,for循環僅用於將字符串添加到結果中。

此打印:

Array 
(
    [NPD4196-2a_5_0] => Array 
     (
      [0] => Array 
       (
        [0] => Geldanamycin 
        [1] => 0.166516 
        [2] => 0.0068 
       ) 

      [1] => Array 
       (
        [0] => Alamethicin 
        [1] => 0.158302 
        [2] => 0.0206 
       ) 

      [2] => Array 
       (
        [0] => Hydroxytamoxifen 
        [1] => 0.1429 
        [2] => 0.0183 
       ) 
... 
+0

幹得好!謝謝 – cybertextron 2012-08-04 21:16:00

2

(.+?)-\s*([\d\.]+)\s*\(p\s*=\s*([\d\.]+)\)

即會抓住在組1中的元件(例如,格爾德黴素),在第2組的相關值,而在組3

Play with the regex here所述p值。

+0

不完全是,但接近但...當我運行它,我有: 'PHP的警告:使preg_split():未知的修飾詞「-'' – cybertextron 2012-07-29 00:53:30

+0

@philippe PHP可能沒有按不喜歡字面上的短劃線。試着用'\ -'替換'-' – 2012-07-29 20:06:27