使用正则表达式从字符串中获取匹配模式的最短方法

时间:2017-05-30 21:18:56

标签: php regex

我有很长的字符串要解析,看起来像那样(它的一部分)

$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);

它不是实际问题,更理论化。我知道如何获得我需要的结果,我想知道是否有更简单,更优雅的方式。

感谢。

3 个答案:

答案 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*([^;]*)/

demo online

<强>详情:

  • (\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