You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:54:32