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)2
foreach($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如果我的回答令人满意,请给它绿色的勾号(并可能因为它有帮助而投票)。如果有什么地方不太对劲,请给我解释一下,我会设法解决的。