将标签放在Smarty中字符串的一部分周围


Put tags around part of string in Smarty

我从MySQL数据库中获取字符串。示例字符串:

'
{something}Lorem ipsum{/something} dolor sit amet, consectetur adipiscing elit. 
Scrupulum, inquam, abeunti; 
{blablabla}Illa tamen simplicia{blablabla}, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua. 
Stoici scilicet. Scrupulum, inquam, abeunti;
'

在php中,我将字符串分配给一个Smarty变量,如下所示:

$smarty->assign('homePageText', $string);

现在,我希望能够在模板中做这样的事情:

{$homePageText}
  {something}
    <a href="http://www.domain.com/" class="foo">{$}</a>
  {/something}
  {blablabla}
    <b class="bar"><i>{$}</i></b>
  {/blablabla}
{/$homePageText}

因此字符串将变为:

'
<a href="http://www.domain.com/" class="foo">Lorem ipsum</a> dolor sit amet, consectetur adipiscing elit. 
Scrupulum, inquam, abeunti; 
<b class="bar"><i>Illa tamen simplicia</i></b>, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua. 
Stoici scilicet. Scrupulum, inquam, abeunti;
'

这样您就可以在Smarty模板中的变量部分周围放置标记。Smarty 3.0中已经有这样的功能了吗?或者,我如何在php5.4中将其构建到smarty中?我希望在我的模板中尽可能少地使用php代码。此外,{something}<tag>{$}</tag>{/something}部分不应该在php文件中,因为每页将有多个模板

我在类似的设置中使用了一个简单的replace修饰符。但我认为这种方法既不优雅也不灵活。无论如何,我的数据库中的字符串看起来是这样的:

'%something1%Lorem ipsum%something2% dolor sit amet, consectetur adipiscing elit. 
Scrupulum, inquam, abeunti; 
%blablabla1%Illa tamen simplicia%blablabla2%, vestra versuta.
Non semper, inquam; Sed mehercule pergrata mihi oratio tua. 
Stoici scilicet. Scrupulum, inquam, abeunti;'

模板中的代码看起来是这样的(去掉换行符!):

{$homePageText|replace:'%something1%':'<a href="http://www.domain.com/" class="foo">'
    |replace:'%something2%':'</a>'
    |replace:'%blablabla1%':'<b class="bar"><i>'
    |replace:'%blablabla2%':'</i></b>'
}

我在一个场景中使用它,其中翻译来自数据库表,但一些HTML标记或URL在模板中是硬编码的。

顺便说一句:你可以用regex_replace一步插入开始和结束标记,但这并不能真正提高可读性。。。

|regex_replace:'/%something1%(.*)%something2%/':'<a href="http://www.domain.com/" class="foo">''1</a>'

我为Smarty:添加了一个插件

class SmartyPlugins {
    public static function addTags($string, $search, $openingTag, $closingTag) {
        return str_replace(
            '{/' . $search . '}', 
            $closingTag, 
            str_replace(
                '{' . $search . '}', 
                $openingTag, 
                $string
            )
        );
    }
}
//register the plugin
$smarty->registerPlugin('modifier', 'addTags', array('SmartyPlugins', 'addTags'));

现在我可以在模板中这样做:

{$var|addTags:'a':'<a href="http://domain.com">':'</a>'} //changes "Test {a}blablabla{/a} something" to "Test <a href="http://domain.com">blablabla</a> something"