不推荐使用:Joomla插件中的preg_replace()

时间:2015-01-13 09:55:07

标签: php preg-replace joomla3.0 joomla-extensions

我有一个第三方组件Joomla 3的问题。不幸的是我不是一个高级的PHP开发人员,组件所有者现在不支持这个,所以我完全靠我自己=)

提前 - 我已经阅读了所有相关主题,并且无法以正确的方式进行。

我的问题是转换此行:

return preg_replace('/\{([a-zA-Z_]+)\}/e', '$item->\\1', $this->rowtemplate);

使用preg_replace_callback(),因为在PHP 5.5 / e参数中已弃用。

提前多多感谢。

编辑:

整个代码部分:

public function loadRowtemplate ($item)
{
    $table = $this->params->get('table');


    if(!$this->rowtemplate) {
        $rowtemplate = $table['row'][0] ? "<td><p>" . nl2br($table['row'][0]) . "</p></td>" : "";
        $rowtemplate .= $table['row'][1] ? "<td><p>" . nl2br($table['row'][1]) . "</p></td>" : "";
        $rowtemplate .= $table['row'][2] ? "<td><p>" . nl2br($table['row'][2]) . "</p></td>" : "";
        $rowtemplate .= $table['row'][3] ? "<td><p>" . nl2br($table['row'][3]) . "</p></td>" : "";
        $rowtemplate .= $table['row'][4] ? "<td><p>" . nl2br($table['row'][4]) . "</p></td>" : "";
        $this->rowtemplate = str_replace(",", "<br/>", $rowtemplate);
    }

    **return preg_replace('/\{([a-zA-Z_]+)\}/e', '$item->\\1', $this->rowtemplate);**

}

编辑2:

使用PHP 5.5的Harold Prins Extension(com_profiler)为Joomla 3和Profiler提供了正确的解决方案:

return preg_replace_callback(
'/\{([a-zA-Z_]+)\}/',
function ($match) use ($item) {
    if (isset($item->{$match[1]})) {
        return $item->{$match[1]};
    }

    return "";
},
$this->rowtemplate

);

非常感谢Matteo Tassinari提供解决方案。

1 个答案:

答案 0 :(得分:2)

你想要的应该是这样的:

return preg_replace_callback(
    '/\{([a-zA-Z_]+)\}/',
    function ($match) use ($item) {
        if (isset($item->{$match[1]})) {
            return $item->{$match[1]};
        }

        return "";
    },
    $this->rowtemplate
);

另请参阅函数本身的文档:http://php.net/manual/en/function.preg-replace-callback.php