这个正则表达式查找/替换是否可以优化?

时间:2009-06-12 08:49:04

标签: php regex

简单的一个,我写了一个正则表达式,用html片段中的php常量查找和替换标签。我的解决方案,工作,只是感觉不对。怎么能改善呢?

preg_match_all('/\{CONSTANT_(.*)\}/', $final, $result, PREG_PATTERN_ORDER);
            for ($i = 0; $i < count($result[1]); $i++) {
               $final = str_replace($result[0][$i], constant($result[1][$i]),$final);
            }

4 个答案:

答案 0 :(得分:1)

您可以使用preg_replace_callback

一次性完成所有操作
function getConstant($matches) 
{
    return constant($matches[1]);
}
$final=preg_replace_callback(
           '/\{CONSTANT_(.*?)\}/',
           "getConstant",
           $final);

注意我已.*非贪婪.*?,如果可能更长时间匹配,这将确保它不会吃掉}。您可以使用([^}]*)或更好的([a-zA-Z0-9_]+)

获得相同的效果

答案 1 :(得分:0)

我总是反对重新发明轮子:如果你需要某种模板引擎(已经是php),请看Smarty

答案 2 :(得分:0)

怎么样?

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit= -1 [, int &$count ]] )

答案 3 :(得分:0)

在正则表达式中使用“.*”时要小心,因为它会贪婪地匹配它找到的所有内容。例如,在以下行中:

{CONSTANT_ONE} blah {CONSTANT_TWO}

上述正则表达式将捕获字符串“ONE} blah {CONSTANT_TWO

您可以使用字符类而不是。匹配除“}”字符以外的任何内容:

/\{CONSTANT_([^}]*)\}/