2013-05-14 106 views
2

我會用sscanf()或(最好)fscanf()掃描/proc/meminfo並返回MemTotalfscanf()/ sscanf() - 匹配可變長度空格?

MemTotal:  1027156 kB 
MemFree:   774596 kB 
Buffers:   23816 kB 
Cached:   198300 kB 

由於空間MemTotal:和實際數量變化之間的數字,我想知道如果sscanf()是足夠聰明的解析是這樣的:

sscanf($line, "MemTotal:\s+%d"); 
請問

sprintf()工作的填充和對齊符與sscanf()呢?

我會自己試試,但我沒有可用的開放/ Linux環境ATM。

+0

不,'sscanf'不理解正則表達式。是的,'sscanf'和'sprintf'的格式說明符是相同的。 – 2013-05-14 07:29:23

回答

4

是,sscanf是足夠聰明的解析與空間之間的任意數字。你甚至不需要用任何特殊的方式來指定它。只要做到

sscanf($line, '%s%d'); 

,你會得到

Array 
(
    [0] => MemTotal: 
    [1] => 1027156 
) 

不幸的是,PHP手冊也不算完全清楚哪些是你可以作爲格式字符串中使用,但由於它是基於UNIX命令,你可以看看其他單證找你有什麼選擇:

這是一個有點繁瑣,讓他們雖然工作。

1

你過於複雜的問題。我建議這種方法在面向未來的關聯數組轉換/proc/meminfo

$input = file_get_contents('/proc/meminfo'); 
$data = []; 
$hits = preg_match_all('/^(.*):\s+([0-9]+)/m', $input, $matches); 
for($i = 0; $i != $hits; $i++) 
    $data[$matches[1][$i]] = $matches[2][$i]; 
var_dump($data); 

Sample output

array(45) { 
    ["MemTotal"]=> 
    string(6) "508856" 
    ["MemFree"]=> 
    string(5) "33984" 
    ["Buffers"]=> 
    string(6) "189124" 
    ["Cached"]=> 
    string(6) "207512" 
    ...etc...