@@ -189,6 +189,7 @@ public function getTemplateProcessor()
189189 *
190190 * @param string $value
191191 * @return string
192+ *
192193 * @throws \Exception
193194 */
194195 public function filter ($ value )
@@ -203,19 +204,21 @@ public function filter($value)
203204 $ this ->filteringDepthMeter ->descend ();
204205
205206 // Processing of template directives.
206- $ templateDirectivesResults = $ this ->processDirectives ($ value );
207+ $ templateDirectivesResults = array_unique (
208+ $ this ->processDirectives ($ value ),
209+ SORT_REGULAR
210+ );
207211
208- foreach ($ templateDirectivesResults as $ result ) {
209- $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
210- }
212+ $ value = $ this ->applyDirectivesResults ($ value , $ templateDirectivesResults );
211213
212214 // Processing of deferred directives received from child templates
213215 // or nested directives.
214- $ deferredDirectivesResults = $ this ->processDirectives ($ value , true );
216+ $ deferredDirectivesResults = array_unique (
217+ $ this ->processDirectives ($ value , true ),
218+ SORT_REGULAR
219+ );
215220
216- foreach ($ deferredDirectivesResults as $ result ) {
217- $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
218- }
221+ $ value = $ this ->applyDirectivesResults ($ value , $ deferredDirectivesResults );
219222
220223 if ($ this ->filteringDepthMeter ->showMark () > 1 ) {
221224 // Signing own deferred directives (if any).
@@ -282,6 +285,35 @@ private function processDirectives($value, $isSigned = false): array
282285 return $ results ;
283286 }
284287
288+ /**
289+ * Applies results produced by directives.
290+ *
291+ * @param string $value
292+ * @param array $results
293+ *
294+ * @return string
295+ */
296+ private function applyDirectivesResults (string $ value , array $ results ): string
297+ {
298+ $ processedResults = [];
299+
300+ foreach ($ results as $ result ) {
301+ foreach ($ processedResults as $ processedResult ) {
302+ $ result ['directive ' ] = str_replace (
303+ $ processedResult ['directive ' ],
304+ $ processedResult ['output ' ],
305+ $ result ['directive ' ]
306+ );
307+ }
308+
309+ $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
310+
311+ $ processedResults [] = $ result ;
312+ }
313+
314+ return $ value ;
315+ }
316+
285317 /**
286318 * Modifies given regular expression pattern to be able to recognize signed directives.
287319 *
0 commit comments