2016-09-23 1 views
0

У меня есть база данных, содержащая миллионы элементов. Эти элементы должны быть экспортированы через веб-интерфейс. Клиент может указать шаблон (строку) с заполнителями о том, как экспортировать данные.Поток HTTP-ответа анализируемого шаблона, включая циклы

Поскольку массивы данных имеют большой размер, я не могу выполнить простой поиск/замену шаблона и отправить результат как ответ, так как это избавит меня от памяти. Поэтому я передаю ответ через Transfer-Encoding: chunked.

Шаблон может выглядеть следующим образом:

Some static content at the beginning … 

[foreach item]{item.id} {item.name}[/foreach] 

Some static content in between the loops … 

[foreach item]{item.id} {item.value}[/foreach] 

Some static content at the end … 

Как я могу транслировать это последовательно? Если бы была только одна петля foreach, я мог бы просто разделить процесс потоковой передачи в три этапа:

  1. Поток контента перед циклом по строкам.
  2. Итерации через цикл и поток каждого пункта по строкам.
  3. Поток содержимого после цикла по строкам.

Однако шаблон может содержать 0..n циклов foreach (в соответствии с одним и тем же списком элементов). Есть ли регулярное выражение для извлечения всех циклов и содержимого между ними, чтобы я мог перебирать их?

ответ

0

Я решил его, используя preg_split() вырезать шаблон в потоковом состоянии частей, определяя Foreach блоков в качестве разделителя:

$segments = preg_split('@(\[foreach .+?\].*?\[/foreach\])@si', $template, NULL, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE); 

Это важно установить PREG_SPLIT_DELIM_CAPTURE для того, чтобы захватить Foreach блоки, тоже.