phpdocx-premium-12.5-ns中getTemplateVariables无法识别%%变量符号问题
问题描述
我使用phpdocx-premium-12.5-ns版本,创建了包含%%variable%%格式变量的文档,执行以下代码:
require_once 'classes/CreateDocx.php'; $docx = new CreateDocxFromTemplate('document.docx'); $docx->setTemplateSymbol('%%', '%%'); print_r($docx->getTemplateVariables());
但getTemplateVariables()未返回任何内容;若使用${variable}格式变量,该方法会正常返回变量名;当设置模板符号为${和}时,方法也能正常工作。查看CreateDocxFromTemplate.php类代码发现,其调用extractVariablesDistinctSymbols方法时仅使用硬编码正则表达式\$(?:\{|\[^{$]*\>\{)[^}$]*\}进行匹配,导致无法识别%%格式的变量。
解决方法
原因分析
extractVariablesDistinctSymbols方法中的正则表达式是固定的,只针对默认的${variable}格式设计,没有适配用户通过setTemplateSymbol设置的自定义符号对,因此无法提取%%variable%%这类格式的变量。
方案1:修改核心源码(适配自定义符号)
找到CreateDocxFromTemplate.php中的extractVariablesDistinctSymbols方法,将原有的硬编码正则替换为根据当前模板符号动态生成的正则规则:
// 替换原方法中的硬编码正则部分 $startSymbol = preg_quote($this->_templateSymbol[0], '/'); $endSymbol = preg_quote($this->_templateSymbol[1], '/'); $pattern = '/' . $startSymbol . '([^' . $endSymbol . ']+)' . $endSymbol . '/'; preg_match_all($pattern, $content, $matches);
修改后,方法会根据你通过setTemplateSymbol设置的符号对(比如%%和%%)动态生成匹配正则,从而正确提取变量。
方案2:自定义变量提取方法(无需修改源码)
如果不想修改phpdocx的核心文件,可以在自己的代码中实现提取逻辑,读取文档内容后手动匹配:
require_once 'classes/CreateDocx.php'; $docx = new CreateDocxFromTemplate('document.docx'); $docx->setTemplateSymbol('%%', '%%'); // 获取文档XML内容 $contentPath = $docx->getDocxPath() . 'word/document.xml'; $xmlContent = file_get_contents($contentPath); // 自定义正则匹配%%格式变量 $startSymbol = '%%'; $endSymbol = '%%'; $pattern = '/' . preg_quote($startSymbol, '/') . '([^' . preg_quote($endSymbol, '/') . ']+)' . preg_quote($endSymbol, '/') . '/'; preg_match_all($pattern, $xmlContent, $matches); // 去重后输出变量列表 $variables = array_unique($matches[1]); print_r($variables);
注意事项
- 修改核心源码前请备份原文件,避免后续版本更新覆盖修改内容。
- 自定义提取方法需确保文档路径正确,
getDocxPath()方法可获取phpdocx解压后的文档目录。
内容的提问来源于stack exchange,提问作者Bilal H
相关产品推荐
相关产品推荐

