简单的正则表达式无法使用preg_replace_callback()

时间:2014-01-21 19:24:56

标签: php regex preg-replace-callback

我正在尝试使用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>

1 个答案:

答案 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