2012-07-29 55 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