好的,所以我先尝试搜索,但我不知道如何表达这个问题或搜索短语。让我解释。
我的数据如下所示:
<!-- data:start -->
<!-- 0:start -->
<!-- 0:start -->0,9<!-- 0:stop -->
<!-- 1:start -->0,0<!-- 1:stop -->
<!-- 2:start -->9,0<!-- 2:stop -->
<!-- 3:start -->9,9<!-- 3:stop -->
<!-- 4:start -->0,9<!-- 4:stop -->
<!-- 0:stop -->
<!-- 1:start -->
<!-- 0:start -->1,5<!-- 0:stop -->
<!-- 1:start -->1,6<!-- 1:stop -->
<!-- 2:start -->3,6<!-- 2:stop -->
<!-- 3:start -->3,8<!-- 3:stop -->
<!-- 4:start -->4,8<!-- 4:stop -->
<!-- 1:stop -->
<!-- 2:start -->
<!-- 0:start -->0,7<!-- 0:stop -->
<!-- 1:start -->1,7<!-- 1:stop -->
<!-- 2:stop -->
<!-- data:stop -->
所以它基本上是一堆点。这是我目前用来尝试解析它的代码,以便它可以创建一个像这样的数组:
Array (
0 => Array (
0 => "0,9",
1 => "0,0",
2 => "9,0",
3 => "9,9",
4 => "0,9"
),
1 => Array (
0 => "1,5",
1 => "1,6",
2 => "3,6",
3 => "3,8",
4 => "4,8"
),
2 => Array (
0 => "0,7",
1 => "1,7"
)
)
但是,它返回一个如下所示的数组:
Array (
0 => "0,9",
1 => "0,0",
2 => "9,0"
)
查看我屏幕上的较大数组,您会看到它在匹配时设置了该变量的第一个实例。那么我如何让它首先找到最广泛的匹配然后处理内部。这是我目前正在使用的功能:
function explosion($text) {
$number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $text, $matches, PREG_SET_ORDER);
if ($number == 0) return $text;
else unset($item);
foreach ($matches as $item) if (empty($data[$item[2]])) $data[$item[2]] = $this->explosion($item[3]);
return $data;
}
我确信这将是我忽略的一些愚蠢和简单的事情,但这只是我想它对你来说是一个简单的答案。
编辑:这是我从中提取此样本的整个数据集的完整输出日志。标签被打印出来(用 > 和 < 替换它们)并且它们都在一个巨大的<code></code>
元素中以便于阅读。
这是搞砸的部分:
Array ( [0] => <!-- 0:start --> <!-- 0:start -->0,9<!-- 0:stop --> [1] => 0 [2] => <!-- 0:start -->0,9 )
0 => <!-- 0:start -->0,9
因此,它会在其中的另一块停止标记的第一次出现处停止。我是否应该考虑相反的方向并首先处理最小的部分,替换它们以免中断较大的部分,然后再处理较大的部分?