2017-05-30 72 views
1

字符串匹配的模式我有很長的字符串進行解析,這看起來像(一部分)最短的方式來獲得與正則表達式

$string = 'FIRM_ID = MC0356400000; TAG = EQTV; CURR_CODE = SUR; CLIENT_CODE = FR334; LIMIT_KIND = 1; OPEN_BALANCE = 4822.84; OPEN_LIMIT = 0.00; LEVERAGE = 0;' 

我需要從字符串得到的PHP變量的值,這是我做的preg_match:

preg_match("/FIRM_ID = (.*?);/", $string, $m); 
$firm_id = trim($m[1]); 

preg_match("/CLIENT_CODE = (.*?);/", $string, $m); 
$client_code = trim($m[1]); 

...等等

我想知道有沒有辦法做同樣的一條線?可以是與preg_replace函數或其他功能,所以就不必首先聲明$米變量,然後從[1]元素取出。

因此,代碼應該看起來像

$firm_id = somefunction($string); 
$client_code = somefunction($string); 

它不是實際的問題,更多的理論。我知道如何得到我需要的,我想知道是否有一個更簡單,更優雅的方式。

謝謝。

+0

也許像'(\ S +)\ H = \ H([^] +)''與然後preg_match_all'使用'group' 1和'組2'..或者你可以使用變量.. – chris85

回答

2

比賽並捕獲鍵值對,然後組合成一個數組:

$re = '/(\w+)\s*=\s*([^;]*)/'; 
$str = 'FIRM_ID = MC0356400000; TAG = EQTV; CURR_CODE = SUR; CLIENT_CODE = FR334; LIMIT_KIND = 1; OPEN_BALANCE = 4822.84; OPEN_LIMIT = 0.00; LEVERAGE = 0;'; 
preg_match_all($re, $str, $matches); 
print_r(array_combine($matches[1],$matches[2])); 

PHP demo,結果是:

Array 
(
    [FIRM_ID] => MC0356400000 
    [TAG] => EQTV 
    [CURR_CODE] => SUR 
    [CLIENT_CODE] => FR334 
    [LIMIT_KIND] => 1 
    [OPEN_BALANCE] => 4822.84 
    [OPEN_LIMIT] => 0.00 
    [LEVERAGE] => 0 
) 

的正則表達式是

/(\w+)\s*=\s*([^;]*)/ 

看到的是demo online

詳細

  • (\w+) - 第1組:一個或多個單詞字符
  • \s*=\s* - 包圍可選空白(一個或多個)
  • ([^;]*)一個= - 組2:零個或多個字符除了;

要 「初始化」 每個變量的時間,你可以使用一個

$var_name = 'FIRM_ID'; 
$re = '/' . $var_name . '\s*=\s*\K[^;]*/'; 
$str = 'FIRM_ID = MC0356400000; TAG = EQTV; CURR_CODE = SUR; CLIENT_CODE = FR334; LIMIT_KIND = 1; OPEN_BALANCE = 4822.84; OPEN_LIMIT = 0.00; LEVERAGE = 0;'; 
preg_match($re, $str, $m); 
print_r($m); 

PHP demo

\K是匹配重置運算符,它省略了當前匹配迭代內迄今爲止匹配的所有文本。

+0

真的很整潔!不完全是我所要求的,但肯定不錯 –

+0

@DenisMatafonov:你問過https://regex101.com/r/iDWWwy/1嗎?但是,這樣使用'preg_replace'可能會導致回溯太多,並且會導致速度變慢。我仍然建議使用'preg_match'。或者你只是想擺脫陣列中的2個項目? –

+0

@DenisMatafonov:您可以使用像[this](http://ideone.com/5lqLNl)這樣的解決方案將值傳遞給1項數組。 –

3

如果你刪除空格與&取代;,你可以這樣做:

parse_str(str_replace([' ', ';'], ['', '&'], $string), $result); 

其中產生一個易於使用的關聯數組:

Array 
(
    [FIRM_ID] => MC0356400000 
    [TAG] => EQTV 
    [CURR_CODE] => SUR 
    [CLIENT_CODE] => FR334 
    [LIMIT_KIND] => 1 
    [OPEN_BALANCE] => 4822.84 
    [OPEN_LIMIT] => 0.00 
    [LEVERAGE] => 0 
) 

所以才echo $result['FIRM_ID'];

1

也可以使用list功能之後preg_match_all

preg_match_all('/(\w[\w-]*)\h*=\h*([^;\h]+);/', $string, $matches); 

list($firmId, $tag, $currCode, $clientCode, $limitKind, $openBalance, $openLimit, $leverage) = $matches[2]; 

echo $firmId; 
//=> MC0356400000 
echo $tag; 
//=> EQTV 
echo $clientCode; 
//=> FR334 
echo $openBalance; 
//=> 4822.84 
+0

希望總會有8個匹配;-) – AbraCadaver

+0

人們也可以使用部分列表,例如'list($ firmId,$ tag,$ currCode,$ clientCode,$ limitKind,$ openBalance)' – anubhava