我有很多行(超過32k)的文件。排看起來像:創建正則表達式模式以匹配空格分隔的字符串
34 Item
5423 11Item
44 Item
它是ID的第一個數字。我想讓聯合。陣列:陣列( 「34」=> 「項目」, 「5423」=> 「11Item」, 「44」=> 「物品」)
- ID可以是從1到5的長度(1 - 65366)
- 項目的名稱可以以數字開頭
- 最少一個(但可以不止一個)的ID和項目之間的空間名稱
所以主要劃分爲空間或若干人。使用PHP。
我有很多行(超過32k)的文件。排看起來像:創建正則表達式模式以匹配空格分隔的字符串
34 Item
5423 11Item
44 Item
它是ID的第一個數字。我想讓聯合。陣列:陣列( 「34」=> 「項目」, 「5423」=> 「11Item」, 「44」=> 「物品」)
所以主要劃分爲空間或若干人。使用PHP。
您可以使用此:
$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);
謝謝!這對我很有用 –
這是一種不檢查數據有效性但可能有效的方法。它根據空間(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];
}
使用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
)
爲什麼不能'$ cont = file_get_contents($ file); preg_match_all('/ ^(?
@SharanyaDutta:有超過32K行(如他在問題中所說),所以它可能會很慢。如果他已經遍歷所有行,'preg_match()'會更適合。 –
非常感謝。它在一種情況下效果很好但不正確:字符串以數字結尾。例如: BLABLA TEF2200 In $ matches ['id']我得到:... 3470 2200 ...但應該只有3470 –
貌似我忘了補充一點,名稱可以由幾個單詞。例如:3411項目Items100。所以以數字結尾 –
項目名稱是否包含空格? –
是的。它可能是。 –