diff --git a/src/PhpWord/TemplateProcessor.php b/src/PhpWord/TemplateProcessor.php index 1ad901d480..20cbb38bff 100644 --- a/src/PhpWord/TemplateProcessor.php +++ b/src/PhpWord/TemplateProcessor.php @@ -1063,14 +1063,28 @@ public function saveAs($fileName): void */ protected function fixBrokenMacros($documentPart) { - $brokenMacroOpeningChars = substr(self::$macroOpeningChars, 0, 1); - $endMacroOpeningChars = substr(self::$macroOpeningChars, 1); - $macroClosingChars = self::$macroClosingChars; - return preg_replace_callback( - '/\\' . $brokenMacroOpeningChars . '(?:\\' . $endMacroOpeningChars . '|[^{$]*\>\{)[^' . $macroClosingChars . '$]*\}/U', + sprintf( + '/%s.+%s/U', + implode('', array_map( + function (string $char) { + return preg_quote($char) . '(?:<[^>]+>)*'; + }, + str_split(self::$macroOpeningChars) + )), + implode('', array_map( + function (string $char) { + return '(?:<[^>]+>)*' . preg_quote($char); + }, + str_split(self::$macroClosingChars) + )) + ), function ($match) { - return strip_tags($match[0]); + preg_match_all('/<[^>]+>/s', $match[0], $tags); + $tags = implode('', $tags[0]); + $tags = str_replace('', '', $tags); + + return strip_tags($match[0]) . $tags; }, $documentPart ); diff --git a/tests/PhpWordTests/TemplateProcessorTest.php b/tests/PhpWordTests/TemplateProcessorTest.php index f2d2cfbf13..5c11d3dd3d 100644 --- a/tests/PhpWordTests/TemplateProcessorTest.php +++ b/tests/PhpWordTests/TemplateProcessorTest.php @@ -1253,19 +1253,28 @@ public function testFixBrokenMacros(): void self::assertEquals('${documentContent}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('${documentContent}'); - self::assertEquals('${documentContent}', $fixed); + self::assertEquals('${documentContent}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$1500${documentContent}'); self::assertEquals('$1500${documentContent}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$1500${documentContent}'); - self::assertEquals('$1500${documentContent}', $fixed); + self::assertEquals('$1500${documentContent}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('25$ plus some info {hint}'); self::assertEquals('25$ plus some info {hint}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$15,000.00. ${variable_name}'); - self::assertEquals('$15,000.00. ${variable_name}', $fixed); + self::assertEquals('$15,000.00. ${variable_name}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('before ${variable} after'); + self::assertEquals('before ${variable} after', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('before ${variable} after'); + self::assertEquals('before ${variable} after', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('${variable1} ${variable2}'); + self::assertEquals('${variable1} ${variable2}', $fixed); } /** @@ -1285,19 +1294,31 @@ public function testFixBrokenMacrosWithCustomMacro(): void self::assertEquals('{{documentContent}}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('{{documentContent}}'); - self::assertEquals('{{documentContent}}', $fixed); + self::assertEquals('{{documentContent}}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('{{documentContent}}'); + self::assertEquals('{{documentContent}}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$1500{{documentContent}}'); self::assertEquals('$1500{{documentContent}}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$1500{{documentContent}}'); - self::assertEquals('$1500{{documentContent}}', $fixed); + self::assertEquals('$1500{{documentContent}}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('25$ plus some info {hint}'); self::assertEquals('25$ plus some info {hint}', $fixed); $fixed = $templateProcessor->fixBrokenMacros('$15,000.00. {{variable_name}}'); - self::assertEquals('$15,000.00. {{variable_name}}', $fixed); + self::assertEquals('$15,000.00. {{variable_name}}', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('before {{variable}} after'); + self::assertEquals('before {{variable}} after', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('before {{variable}} after'); + self::assertEquals('before {{variable}} after', $fixed); + + $fixed = $templateProcessor->fixBrokenMacros('{{variable1}} {{variable2}}'); + self::assertEquals('{{variable1}} {{variable2}}', $fixed); } /**