0

我有这样的一行:

   $line1= "System configuration: lcpu=96 mem=393216MB ent=16.00"

我需要从这个字符串中解析出 lcpu、mem 和 ent 值。我尝试过这样的事情:

  $lcpu=preg_match('/(?P<lcpu>\w+)= (?P<digit>\d+)/', $line1, $matches);

似乎没有从字符串 $line1 中获取 lcpu 值,有什么想法我在这里做错了吗?

4

5 回答 5

2

你几乎在那里有一个查询字符串,所以也许

$string = explode(": ", $line1);
$string = str_replace(" ", "&", $string[1]);
parse_str($string, $values);

echo $values['lcpu'];
于 2013-06-27T16:45:10.213 回答
2

另一种解析字符串的方法:

$line1= "System configuration: lcpu=96 mem=393216MB ent=16.00";

list($lcpu, $mem, $ent) = sscanf($line1, "System configuration: lcpu=%d mem=%dMB ent=%f");
于 2013-06-27T16:44:35.077 回答
0

就个人而言,我会改为通过语法解析(而不是搜索特定的键):

<?php

$input = "System configuration: lcpu=96 mem=393216MB ent=16.00";

// Strip out "System configuration: "
$values = preg_replace('~^.*?:\s*$~', '', $input);

// Split on whitespace separator
$values = preg_split('~\s+~', $values);

// Convert to associative array
foreach ($values as $i => $item)
{
    // Explode on assignment (=)
    list($k, $v) = explode('=', $item);
    $values[$k] = $v;
    unset($values[$i]);
}
于 2013-06-27T16:43:19.830 回答
0

解析字符串的方法有很多。Explode 通常比使用正则表达式更快,因此这种方式可能比依赖正则表达式的方法性能更高。

list( , , $lcpu_pair )= explode( " ", $line1 );

list( , $lcpu_value ) = explode( "=", $lcpu_pair );

$lcpu_value将包含“96”。

于 2013-06-27T16:39:45.400 回答
0

为什么不使用一个简单的函数来获取两个字符串之间的字符串。如果 lcpu 值总是以“lcpu=”为前缀并以“”(空格)结尾,那么您可以使用:

    function getBetween($str, $start, $end)
    {
        $r = explode($start, $str);
        if (isset($r[1])) 
        {
            $r = explode($end, $r[1]);
            return $r[0];
        }
        return false;
    }

然后说:

   if (getBetween($line1, 'lcpu=', ' ')) { ... }

如果没有找到,它将返回 false。

于 2013-06-27T16:42:08.820 回答