Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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 reg exp:匹配重复模式_Php_Regex - Fatal编程技术网

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
将捕获:

  • 管子前面的部分
  • 一部分接一部分
“+”的贪婪性质使得捕获组([a-z]+:[a-z0-9]+,?)只捕获与此正则表达式匹配的最后一组字符

/(?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);