Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式从字符串中获取匹配模式的最短方法_Php_Regex - Fatal编程技术网

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

Php 使用正则表达式从字符串中获取匹配模式的最短方法,php,regex,Php,Regex,我有很长的字符串要解析,看起来是这样的(它的一部分) 我需要从该字符串中获取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]); 。。。等等 我想知道有没有一种方法可以在同一行中实现同样

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

我需要从该字符串中获取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);
这不是一个实际问题,而是一个理论问题。我知道如何得到我需要的结果,我想知道是否有更简单、更优雅的方法


谢谢。

如果删除空格并替换
使用
,您可以执行以下操作:

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']

如果删除空格并替换
使用
,您可以执行以下操作:

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']

匹配并捕获键值对,然后组合成一个数组:

$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]));
见结果:

正则表达式是

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

详细信息

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


\K
是匹配重置运算符,它省略了当前匹配迭代中迄今为止匹配的所有文本。

匹配并捕获键值对,然后合并到一个数组中:

$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]));
见结果:

正则表达式是

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

详细信息

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


\K
是匹配重置运算符,它会忽略当前匹配迭代中迄今为止匹配的所有文本。

您也可以在
预匹配后使用
列表功能:

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

您也可以在
preg\u match\u all
之后使用
list
功能:

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

可能类似于
(\S+)\h=\h([^;]+)
preg\u-match\u-all
然后使用
group
1和
group 2
。或者您可以使用变量..可能类似于
(\S+)\h=\h([^;]+)
使用
preg\u match\u all
然后使用
group
1和
group 2
。或者您可以使用变量..非常好!不完全是我想要的,但绝对是good@DenisMatafonov:你要求什么?但是,以这种方式使用
preg_replace
可能会导致太多回溯,从而导致速度减慢。我仍然建议使用
preg\u match
。或者你只是想去掉数组中的两个项目?@DenisMatafonov:你可以使用一种解决方案,比如只将值放入一个项目数组中。这种解决方案是最优雅的,真的很简洁!不完全是我想要的,但绝对是good@DenisMatafonov:你要求什么?但是,以这种方式使用
preg_replace
可能会导致太多回溯,从而导致速度减慢。我仍然建议使用
preg\u match
。或者你只是想去掉数组中的2个项目?@DenisMatafonov:你可以使用一种解决方案,比如只将值放入1个项目的数组中。这种解决方案是最优雅的,希望总是正好有8个匹配;-)你也可以使用部分列表,例如
list($firmId,$tag,$currCode,$clientCode,$limitKind,$openBalance)
希望总是有8个匹配;-)您也可以使用部分列表,例如
list($firmId,$tag,$currCode,$clientCode,$limitKind,$openBalance)