Php 如何将字符串解析为多维数组(regex?)
我需要将数据逐块传递到数组,如何才能做到这一点?我需要使用正则表达式吗?我的脚本给了我错误,因为我不能像我希望的那样分离它。有人有什么想法吗 数据: 我需要这样:Php 如何将字符串解析为多维数组(regex?),php,arrays,regex,multidimensional-array,preg-match-all,Php,Arrays,Regex,Multidimensional Array,Preg Match All,我需要将数据逐块传递到数组,如何才能做到这一点?我需要使用正则表达式吗?我的脚本给了我错误,因为我不能像我希望的那样分离它。有人有什么想法吗 数据: 我需要这样: Array ( [0] => Array ( [0] => 11111111 [1] => 222222222 [2] => 3333333333
Array (
[0] => Array
(
[0] => 11111111
[1] => 222222222
[2] => 3333333333
)
),
[1] => Array
(
[0] => aaaaaaaaaaa
[1] => bbbbbbbbbb
[2] => cccccccccc
[3] => ddddddddddd
)
),
[2] => Array
(
[0] => yyyyyyyyyyy
xxxxxxxx
ffffffffff
[1] => rrrrrrrrrrrr
)
),
)
我的代码(失败):
这里有一种非正则表达式的方法:将字符串拆分为行并在它们上迭代。检查指定的条件,如果符合条件,则将每一行添加到子数组中。然后,当到达
~end
行时,将子数组附加到主数组
$sub_bloques = [];
$hola = [];
foreach(array_map('trim', explode("\n", $texto)) as $line) {
if ($line && substr($line, 0, 1) !== '~') {
$sub_bloques[] = $line;
}
if ($line == '~end') {
$hola[] = $sub_bloques;
$sub_bloques = [];
}
}
对于正则表达式解决方案,首先在
~end
上分解以将主文本分成多个部分,然后在各部分上分解preg\u match\u all
,以查找符合条件的行
foreach (explode('~end', $texto, -1) as $section) {
preg_match_all('/\n *(?!~)(\w+)/', $section, $matches);
if ($matches[1]) $result[] = $matches[1];
}
(?!~)
是一个负回溯,用于排除以~
开头的行。也许有一些方法可以用一个很酷的正则表达式来完成整个过程,但我不太擅长。这里有一种非正则表达式的方法:将字符串拆分成行并迭代。检查指定的条件,如果符合条件,则将每一行添加到子数组中。然后,当到达~end
行时,将子数组附加到主数组
$sub_bloques = [];
$hola = [];
foreach(array_map('trim', explode("\n", $texto)) as $line) {
if ($line && substr($line, 0, 1) !== '~') {
$sub_bloques[] = $line;
}
if ($line == '~end') {
$hola[] = $sub_bloques;
$sub_bloques = [];
}
}
对于正则表达式解决方案,首先在
~end
上分解以将主文本分成多个部分,然后在各部分上分解preg\u match\u all
,以查找符合条件的行
foreach (explode('~end', $texto, -1) as $section) {
preg_match_all('/\n *(?!~)(\w+)/', $section, $matches);
if ($matches[1]) $result[] = $matches[1];
}
(?!~)
是一个负回溯,用于排除以~
开头的行。也许有办法用一个很酷的大正则表达式来完成整个过程,但我不太擅长。因为您希望在输出数组中将子块划分为块,所以该方法需要两个步骤。原因是您的子块具有不同的捕获组计数,并且正则表达式不允许这种变化
代码:
输出*重新格式化/压缩以节省此页面上的空间():
或者,如果希望在1-dim阵列中列出所有子块(不按块划分),则可以一步构建输出阵列:
if(preg_match_all("/(?:\~\d+\s*)\K.+?(?:\s+\S+)*?(?=\s+\~)/s", $texto, $coincidencias)){
var_export($coincidencias[0]);
}
1-dim输出:
array (
0 => '11111111',
1 => '222222222',
2 => '3333333333',
3 => 'aaaaaaaaaaa',
4 => 'bbbbbbbbbb',
5 => 'cccccccccc',
6 => 'ddddddddddd',
7 => 'yyyyyyyyyyy
xxxxxxxx
ffffffffff',
8 => 'rrrrrrrrrrrr',
)
因为您希望在输出数组中将子块分成块,所以该方法需要两个步骤。原因是您的子块具有不同的捕获组计数,并且正则表达式不允许这种变化 代码: 输出*重新格式化/压缩以节省此页面上的空间():
或者,如果希望在1-dim阵列中列出所有子块(不按块划分),则可以一步构建输出阵列:
if(preg_match_all("/(?:\~\d+\s*)\K.+?(?:\s+\S+)*?(?=\s+\~)/s", $texto, $coincidencias)){
var_export($coincidencias[0]);
}
1-dim输出:
array (
0 => '11111111',
1 => '222222222',
2 => '3333333333',
3 => 'aaaaaaaaaaa',
4 => 'bbbbbbbbbb',
5 => 'cccccccccc',
6 => 'ddddddddddd',
7 => 'yyyyyyyyyyy
xxxxxxxx
ffffffffff',
8 => 'rrrrrrrrrrrr',
)
我不确定我是否正确理解了要求,请您确认一下好吗?“每个非空行不以字符开头,应该是数组中的一个条目”@Dragos从“~0”到“~end”是一个块(现在是3个块),每个块在~0、~1、~2下的文本到数组位置(仅文本)我宁愿分两步操作:1<代码>$level1=分解('~end',$data)2
foreach($level1作为$subItem){$matches=preg\u match\u all('^(\w*)$,$subItem)}
@Dragos print\r($matches)=>0我不确定我是否正确理解了要求,请确认好吗?“每个非空行不以字符开头,应该是数组中的一个条目”@Dragos从“~0”到“~end”是一个块(现在是3个块),每个块在~0、~1、~2下的文本到数组位置(仅文本)我宁愿分两步操作:1<代码>$level1=分解('~end',$data)2foreach($level1作为$subItem){$matches=preg_match_all(“^(\w*)$”,$subItem)}
@Dragos print_r($matches)=>0这很好,但是(~0 yyyyyyyyyyyyyyyyyyyyyyyyyxxxx ffffffff)是一个文本,而不是新行,文本有更多\n…对不起,我不知道你的意思。请你再给我解释一下好吗?最后一块~0 YYYYYYYY xxxxxxxx FFFFFFFF,是1个文本,不是3个positions@dont-死机[2]=>数组([0]=>yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy。我以为你是这个意思,但我不是这个意思。这很好,但是(~0 yyyyyyyyyyyyyyyyyyyyyyxxxx ffffffffff)是一个文本,不是新行,文本有更多\n…对不起,我不确定我是否理解你的意思。请你再给我解释一下好吗?最后一块~0 YYYYYYYY xxxxxxxx FFFFFFFF,是1个文本,不是3个positions@dont-死机[2]=>数组([0]=>yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy。我以为你是这个意思,但我不是这个意思@VictorMoscosoLembcke如果我的答案令人满意,请将其奖励为绿色勾号(并可能因其有帮助而向上投票)。如果有什么地方不太对劲,请向我解释并发表评论,我会尽力解决。@VictorMoscosoLembcke如果我的回答令人满意,请给它绿色的勾号(并可能因为它有帮助而投票)。如果有什么地方不太对劲,请给我解释一下,我会设法解决的。