2013-05-14 104 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...