diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
index 7ecee4a1d3e6aecb12c8ff9685de03b7934ba8e2..fa50442a5ab5cd4907936c10e3f9481fcb8634eb 100644
--- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
+++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
@@ -3340,7 +3340,10 @@ class ContentObjectRenderer implements LoggerAwareInterface
                     // Search for tags to process in current data and
                     // call this method recursively if found
                     if (str_contains($data, '<') && isset($conf['tags.']) && is_array($conf['tags.'])) {
-                        foreach ($conf['tags.'] as $tag => $tagConfig) {
+                        // @todo probably use a DOM tree traversal for the whole stuff
+                        // This iterations basically re-processes the markup string, as
+                        // long as there are `<$tag ` or `<$tag>` "tags" found...
+                        foreach (array_keys($conf['tags.']) as $tag) {
                             // only match tag `a` in `<a href"...">` but not in `<abbr>`
                             if (preg_match('#<' . $tag . '[\s/>]#', $data)) {
                                 $data = $this->parseFuncInternal($data, $conf);