2014-01-18 47 views
0

我有很多行(超過32k)的文件。排看起來像:創建正則表達式模式以匹配空格分隔的字符串

34 Item 
5423 11Item 
44 Item 

它是ID的第一個數字。我想讓聯合。陣列:陣列( 「34」=> 「項目」, 「5423」=> 「11Item」, 「44」=> 「物品」)

  1. ID可以是從1到5的長度(1 - 65366)
  2. 項目的名稱可以以數字開頭
  3. 最少一個(但可以不止一個)的ID和項目之間的空間名稱

所以主要劃分爲空間或若干人。使用PHP。

+0

貌似我忘了補充一點,名稱可以由幾個單詞。例如:3411項目Items100。所以以數字結尾 –

+0

項目名稱是否包含空格? –

+0

是的。它可能是。 –

回答

1

您可以使用此:

$data = <<<'LOD' 
34 Item 
5423 11Item 
44 Item 
546 
65535 toto le héros 
65536 belzebuth 
glups glips 
LOD; 

$result = array(); 

$line = strtok($data, "\r\n"); 

while($line!==false) { 
    $tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY); 
    if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536) 
     $result[$tmp[0]] = $tmp[1]; 
    $line = strtok("\r\n"); 
} 
print_r($result); 
+0

謝謝!這對我很有用 –

1

這是一種不檢查數據有效性但可能有效的方法。它根據空間(s)爆炸每一行,並將結果放入$res關聯數組中。
有關信息,preg_split()允許使用正則表達式分割字符串。

$res = array(); 
foreach($lines as $line) { 
    $data = preg_split('/\s+/', $line); 
    $res[$data[0]] = $data[1];  
} 

如果你真要查你的條件,你可以添加一些if聲明,與ID限制:

$res = array(); 
foreach($lines as $line) { 
    $data = preg_split('/\s+/', $line); 
    $idx = intval($data[0]); 
    if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid 
     $res[$data[0]] = $data[1];  
} 
1

使用preg_match名爲捕獲組:

preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches); 

$matches['id']會包含ID和$matches['name']將包含名稱。

while (/* get each row */) { 
    preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches); 

    $id = $matches['id']; 
    $name = $matches['name']; 

    if ($id > 1 && $id < 65366) { 
     $arr[$id] = $name; 
    } 
} 

print_r($arr); 

輸出示例:

Array 
(
    [34] => Item 
    [5423] => 11Item 
    [44] => Item 
    [3470] => BLABLA TEF2200 
) 

Demo

+0

爲什麼不能'$ cont = file_get_contents($ file); preg_match_all('/ ^(? \ d +)\ s +(? \ w +)$/m',$ cont,$ matches);'? – 2014-01-18 11:58:37

+1

@SharanyaDutta:有超過32K行(如他在問題中所說),所以它可能會很慢。如果他已經遍歷所有行,'preg_match()'會更適合。 –

+0

非常感謝。它在一種情況下效果很好但不正確:字符串以數字結尾。例如: BLABLA TEF2200 In $ matches ['id']我得到:... 3470 2200 ...但應該只有3470 –

相關問題