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