Php reg exp:匹配重复模式
我想匹配下面的字符串Php reg exp:匹配重复模式,php,regex,Php,Regex,我想匹配下面的字符串 abc|q:1,f:2 cba|q:1,f:awd2,t:3awd,h:gr 我正在使用php,并尝试了使用此表达式的preg\u match和preg\u match\u all /^([a-z]+)\|([a-z]+:[a-z0-9]+,?)+$/iU 这仅返回管道前面的第一个零件,以及一个a:1。我做错了什么,为什么会这样,我如何才能让它工作 /^([a-z]+)\|((?:[a-z]+:[a-z0-9]+,?)+)$/iU 将捕获: 管子前面的部分 一部分接
abc|q:1,f:2
cba|q:1,f:awd2,t:3awd,h:gr
我正在使用php,并尝试了使用此表达式的preg\u match
和preg\u match\u all
/^([a-z]+)\|([a-z]+:[a-z0-9]+,?)+$/iU
这仅返回管道前面的第一个零件,以及一个a:1。我做错了什么,为什么会这样,我如何才能让它工作
/^([a-z]+)\|((?:[a-z]+:[a-z0-9]+,?)+)$/iU
将捕获:
- 管子前面的部分
- 一部分接一部分
/(?ms)^((?:[a-z]+)\|(?:[a-z]+:[a-z0-9]+,?)+)$/iU
将捕获所有行
注意要避免的“?:
”。我刚刚试过:
<?php
$string = 'cba|q:1,f:awd2,t:3awd,h:gr';
$subpat = '[a-z]+:[a-z0-9]+';
$pat = "/^([a-z]+)\|($subpat(?:,$subpat)+)$/i";
preg_match( $pat, $string, $matches );
print_r( $matches );
?>
此时,中垂直条前面的部分与[1]
匹配,而中的其余部分与[2]
匹配。重复使用$subpat
,以确保字符串用逗号正确分隔。之后,应用于匹配[2]
$string = 'cba|q:1,f:awd2,t:3awd,h:gr';
$re = '~(?: ^(\w+)\| ) | (?: (\w+) : (\w+) (?:,|$) )~x';
preg_match_all($re, $string, $m, PREG_SET_ORDER);
var_dump($m);
这将同时匹配管道前的零件(“引线”)和所有键值对。“lead”将在$m[0][1]
中,键值将在$m[1..x][2]和[3]
中。添加一些简单的后处理以将其转换为可用表单,例如:
$lead = $m[0][1];
foreach(array_slice($m, 1) as $p)
$data[$p[2]] = $p[3];
var_dump($lead, $data);
难道没有办法把一切都分开吗?所以“cba | q:1,f:awd2,t:3awd,h:gr”变成了['cba',['q':'1','f':'awd2','t':'3awd','h':'gr']],我意识到我并不清楚我在寻找什么样的输出。类似于['cba',['q':'1','f':'awd2','t':'3awd','h':'gr']]的东西会很好:)如问题所示,分解列表需要两个正则表达式。另请参见,
preg_split
可以在此处提供帮助。
$lead = $m[0][1];
foreach(array_slice($m, 1) as $p)
$data[$p[2]] = $p[3];
var_dump($lead, $data);