我有很长的字符串要解析,看起来像那样(它的一部分)
$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或其他函数,因此我不必先声明$ m变量,然后从[1]元素中取出。
所以代码应该看起来像
$firm_id = somefunction($string);
$client_code = somefunction($string);
它不是实际问题,更理论化。我知道如何获得我需要的结果,我想知道是否有更简单,更优雅的方式。
感谢。
答案 0 :(得分: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 :(得分: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*([^;]*)/
<强>详情:
(\w+)
- 第1组:一个或多个单词字符\s*=\s*
- 包含可选空格的=
([^;]*)
- 第2组:除;
以外的零个或多个字符。To&#34;初始化&#34;每个变量一次,你可以使用
$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
是匹配重置运算符,它忽略了当前匹配迭代中到目前为止匹配的所有文本。
答案 2 :(得分: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