【发布时间】:2016-06-22 13:01:03
【问题描述】:
下面的代码正确匹配:
letter 'c' followed by digitletter 'c' followed by digit dash digitdigit may be followed by an other digit enclosed in square parentheses []
并按预期创建一个数组:
Array
(
[0] => Array
(
[start] => 4
[end]=> 8
)
[1] => Array
(
[start] => 2
[end]=>
)
[2] => Array
(
[start] => 3
[end] => 5
)
[3] => Array
(
[start] => 6[2]
[end] =>
)
[4] => Array
(
[start] => 8[4]
[end] => 10
)
[5] => Array
(
[start] => 14
[end] => 21[5]
)
)
代码:
$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]";
$re = "~c(?<start>\d+(?:\[\d+])?)(?:-(?<end>(?&start)?))?~";
$myarray = explode("|",$str);
foreach ($myarray as $my) {
preg_match_all($re, $my, $matches);
$res = array_map(function($ms, $me) {
return array("start" => $ms, "end" => $me);
}, $matches["start"], $matches["end"]);
}
echo "<pre>";
print_r($res);
echo "</pre>";
现在我想添加另一个 key,在 a 之后使用 digit 的值。
所以举个例子,给定上面的$str
$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]".
a 的值是:2 和 6,预期的结果数组如下。 请注意, 6 会针对每个匹配的 c 重复。
Array
(
[0] => Array
(
[a] => 2
[start] => 4
[end]=> 8
)
[1] => Array
(
[a] => 6
[start] => 2
[end]=>
)
[2] => Array
(
[a] => 6
[start] => 3
[end] => 5
)
[3] => Array
(
[a] => 6
[start] => 6[2]
[end] =>
)
[4] => Array
(
[a] => 6
[start] => 8[4]
[end] => 10
)
[5] => Array
(
[a] => 6
[start] => 14
[end] => 21[5]
)
)
【问题讨论】:
-
由于每个数组键必须是唯一的,这是不可能的。
-
好的。知道了。我改变了一点我的问题。请查看编辑后的帖子和预期的结果数组。
-
如果从未定义过“a”或者如果“a”出现在第一个“c”之后会怎样?这些情况可能吗?
-
a总是被定义并且它总是被|(explode("|",$str);) 分解的字符串的第一个字母