Php 相当于preg_match,它返回相当(多维)的数组
是否有一些PHP函数或库,根据正则表达式中的括号将正则表达式的结果返回为相当多维的数组?这就是我的意思:Php 相当于preg_match,它返回相当(多维)的数组,php,regex,multidimensional-array,Php,Regex,Multidimensional Array,是否有一些PHP函数或库,根据正则表达式中的括号将正则表达式的结果返回为相当多维的数组?这就是我的意思: preg_match('/(n(e?)c)(o)/', 'neco', $vysl); var_dump($vysl); 返回以下内容: array(4) { [0]=> string(4) "neco" [1]=> string(3) "nec" [2]=> string(1) "e" [3]=> string(1) "o" }
preg_match('/(n(e?)c)(o)/', 'neco', $vysl);
var_dump($vysl);
返回以下内容:
array(4) {
[0]=>
string(4) "neco"
[1]=>
string(3) "nec"
[2]=>
string(1) "e"
[3]=>
string(1) "o"
}
我希望有这样的输出:
array(3) {
[0]=>
string(4) "neco"
[1]=>
array(2) {
[0]=>
string(3) "nec"
[1]=>
string(1) "e"
}
[2]=>
string(1) "o"
}
每个子表达式结果在该数组中的预期深度。有趣的问题!没有这种内置的东西,您必须捕获匹配的偏移量,并为每个匹配检查其偏移量是否在其他人的范围内:这让我想起嵌套集模型:
function match_tree($re, $subject) {
preg_match($re, $subject, $ms, PREG_OFFSET_CAPTURE);
$p = [(object)[]];
foreach($ms as $m) {
$m = (object) [
'le' => $m[1],
'ri' => $m[1] + strlen($m[0]) - 1,
'str' => $m[0]];
for($i = count($p) - 1; $i >= 0; $i--) {
if(!$i || ($m->le >= $p[$i]->le && $m->le <= $p[$i]->ri)) {
$p []= $m;
$p[$i]->sub []= $m;
break;
}
}
}
return $p[0];
}
返回
stdClass Object
(
[sub] => Array
(
[0] => stdClass Object
(
[le] => 1
[ri] => 9
[str] => necofoabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 1
[ri] => 3
[str] => nec
[sub] => Array
(
[0] => stdClass Object
(
[le] => 2
[ri] => 2
[str] => e
)
)
)
[1] => stdClass Object
(
[le] => 4
[ri] => 4
[str] => o
)
[2] => stdClass Object
(
[le] => 5
[ri] => 9
[str] => foabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 6
[ri] => 9
[str] => oabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 7
[ri] => 9
[str] => abc
)
)
)
)
)
)
)
)
)
打印而不是vardump?vardump没有问题,但是preg_match返回的数组格式有问题。没有格式化数组。Preg_match返回一个普通数组,您看到的格式是vardump输出数组的方式。太好了!这就是我想要的。谢谢我想你的代码应该是PEAR.:-向你表示敬意。你写这段代码的速度比我快。。。
stdClass Object
(
[sub] => Array
(
[0] => stdClass Object
(
[le] => 1
[ri] => 9
[str] => necofoabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 1
[ri] => 3
[str] => nec
[sub] => Array
(
[0] => stdClass Object
(
[le] => 2
[ri] => 2
[str] => e
)
)
)
[1] => stdClass Object
(
[le] => 4
[ri] => 4
[str] => o
)
[2] => stdClass Object
(
[le] => 5
[ri] => 9
[str] => foabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 6
[ri] => 9
[str] => oabc
[sub] => Array
(
[0] => stdClass Object
(
[le] => 7
[ri] => 9
[str] => abc
)
)
)
)
)
)
)
)
)