fscanf()/ sscanf() - 匹配变长的空格?

时间:2013-05-14 07:26:56

标签: php parsing printf scanf

我会使用sscanf()或(最好)fscanf()来扫描/proc/meminfo并返回MemTotal

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

由于MemTotal:与实际数字之间的空格数不尽相同,我想知道sscanf()是否足够智能来解析如下内容:

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

sprintf()的填充和对齐说明符是否也适用于sscanf()

我会自己尝试一下,但我没有可用的开发/ Linux环境ATM。

2 个答案:

答案 0 :(得分:4)

是的,sscanf非常聪明,可以解析它之间的任意数量的空格。您甚至不需要以任何特殊方式指定它。只是做

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

你会得到

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

不幸的是,PHP手册对于您可以用作格式字符串的内容并不是太完整,但由于它基于UNIX命令,您可以查看其他文档以查找您拥有的选项:

让他们工作虽然有点繁琐。

答案 1 :(得分: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...