Хорошо, поэтому я сначала попробовал поискать, но точно не знал, как сформулировать этот вопрос или поисковую фразу. Позвольте мне объяснить.
У меня есть данные, которые выглядят так:
<!-- 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
Таким образом, он останавливается при первом появлении стоп-тега для другого фрагмента внутри него. Должен ли я думать в обратном направлении и сначала обрабатывать наименьшие куски, заменяя их, чтобы не прерывать большие куски, а затем обрабатывать большие куски?