我正在尝试使用preg_replace_callback
根据this answer填充导入文档(我控制的)中的变量,但它不起作用。据我所知,回调永远不会被调用,这意味着正则表达式永远不会匹配。
我的doc.html
文件的简单内容:
<p>test {$test} $test test</p>
PHP:
$test = "ham";
$allVars = get_defined_vars();
$filename = "/path/to/doc.html";
$html = file_get_contents($filename);
$html = preg_replace_callback("/\$[a-zA-Z_][a-zA-Z0-9_]*/", "find_replacements", $html);
echo($html);
exit();
// replace callback function
function find_replacements($match) {
global $allVars;
if (array_key_exists($match[0], $allVars))
return $allVars[$match[0]];
else
return $match[0];
}
输出为<p>test {$test} $test test</p>
,但我期待<p>test {ham} ham test</p>
答案 0 :(得分:1)
首先,正则表达式中的美元符号由PHP插值,因为正则表达式是双引号。用单引号括起来:
$html = preg_replace_callback('/\$[a-zA-Z_][a-zA-Z0-9_]*/', "find_replacements", $html);
其次,发送给回调的值包括美元符号,而$allVars
数组中不存在美元符号,因此您必须手动将其删除:
function find_replacements($match) {
global $allVars;
$match[0] = substr($match[0],1);
if (array_key_exists($match[0], $allVars))
return $allVars[$match[0]];
else
return $match[0];
}
进行这些修改后,我能够收到此输出:
测试{ham} ham test