2013-06-27 17 views
0

文本值我有這樣一行:你如何分析出在PHP

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

我需要從這個字符串解析出LCPU,MEM耳鼻喉科值。我已經試過這樣的事情:

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

似乎並沒有從字符串$一號線得到LCPU值,任何想法,我做錯了什麼?

+0

*它得到了什麼值?你怎麼知道它不工作? –

+0

另外,在正則表達式中你的'='後面有一個空格。在你的字符串中,沒有空間。 –

+0

@火箭Hazmat,糾正後,我得到這個值,lcpu = 96。我需要這個號碼,只有96。 – user1471980

回答

2

你記起來了查詢字符串那麼,也許

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

echo $values['lcpu']; 
+0

謝謝你。如果lcpu有一個文本而不是數字,我將如何只包含數字(數字)? – user1471980

+0

我知道了preg_replace,謝謝 – user1471980

0

解析字符串有很多種方法。爆炸通常比使用正則表達式快,所以這種方式可能比依賴正則表達式的方法更有效。

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

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

$lcpu_value將包含'96'。

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。

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]); 
} 
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"); 
+0

這裏的缺點是鍵/值對的順序非常重要:/。否則,這感覺是最優雅的答案。 – landons