我有这样的一行:
$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 值,有什么想法我在这里做错了吗?
我有这样的一行:
$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 值,有什么想法我在这里做错了吗?
你几乎在那里有一个查询字符串,所以也许
$string = explode(": ", $line1);
$string = str_replace(" ", "&", $string[1]);
parse_str($string, $values);
echo $values['lcpu'];
另一种解析字符串的方法:
$line1= "System configuration: lcpu=96 mem=393216MB ent=16.00";
list($lcpu, $mem, $ent) = sscanf($line1, "System configuration: lcpu=%d mem=%dMB ent=%f");
就个人而言,我会改为通过语法解析(而不是搜索特定的键):
<?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]);
}
解析字符串的方法有很多。Explode 通常比使用正则表达式更快,因此这种方式可能比依赖正则表达式的方法性能更高。
list( , , $lcpu_pair )= explode( " ", $line1 );
list( , $lcpu_value ) = explode( "=", $lcpu_pair );
$lcpu_value
将包含“96”。
为什么不使用一个简单的函数来获取两个字符串之间的字符串。如果 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。