Replies: 2   Views: 57
Variable replacement in parse mode in text field added in a textbox

Posted by npoapplications  · 26-05-2023 - 08:55


I have a minimal example which produces invalid xml in parse mode when a variable is used in a textfield:

$docx = new CreateDocxFromTemplate($docxPath);

$docx->replaceVariableByText([$key => $placeholderValue]);

Without parseMode the variable isn't detected at all.

This template used work without problems in PHPDocx 6.5, but after upgrading to 14 it produces this error:

DOMDocument::loadXML(): Opening and ending tag mismatch: shape line 1 and t in Entity, line: 1


Posted by admin  · 26-05-2023 - 09:56


Since phpdocx 11, that supports using ${  } to wrap placeholders, when using different symbols at the beginning and the end or a symbol greater than 1 byte character, a custom CreateDocxFromTemplate::$regExprVariableSymbols must be set.
In previous versions a single symbol could be used: $, #, @... Using symbols with more than one character was not recommended because MS Word may break them in several tags.

On the API page (  you can read more information about this.

The easiest approach is using a single symbol ($, |, @...) or the default ${ } to wrap placeholders; in these cases you don't need to do any change in CreateDocxFromTemplate::$regExprVariableSymbols.

In your case, as you are using ## to wrap placeholders, please test the following code:

$docx = new CreateDocxFromTemplate('document.docx');
CreateDocxFromTemplate::$regExprVariableSymbols = '##(.*)##';

$docx->replaceVariableByText([$key => $placeholderValue]);

A more complex approach could also be used to fix broken ## symbols as MS Word may add:

$docx = new CreateDocxFromTemplate('document.docx');
CreateDocxFromTemplate::$regExprVariableSymbols = '#(.*)#(.*)#(.*)#';

$docx->replaceVariableByText([$key => $placeholderValue]);

If you sent to contact[at]phpdocx your sample DOCX we'll check it and test with the parseMode option. 

On you can read a post of another user with a similar request.


Posted by npoapplications  · 26-05-2023 - 10:17

Thank you very much, it works without parseMode and your suggested regex.
I falsely understood the api documentation that setting regExprVariableSymbols wasn't neccessary when using identical symbols at beginning and end but apparently this is limited to a single identical symbol.

I will send the template to the contact address in case you want to check parse mode anyway.