Smarty:替换字符串的中间部分

时间:2016-12-17 21:02:30

标签: smarty

您好我有一个smarty变量,其值如(Number,Number,Number),我想替换中间部分:

  • 2,3,4,5,6-> 2-6
  • 1,2,3,4-> 1-4
  • 7,8,9,10,11 - > 7-11

所以基本上我想要第一个,最后一个数字用“ - ”组合,其余的应该被删除。我怎样才能聪明地实现这一目标?

提前致谢!

3 个答案:

答案 0 :(得分:1)

Smarty是一个模板系统。它的主要目的是将从PHP代码(在变量中)接收的数据表示为HTML或任何其他文本格式。

进行转换的最简单方法就是在PHP代码中准备它们并将它们分配给变量。

另一方面,这种转变不是商业规则,而是展示细节;因此,它必须在视图(Smarty)中实现,而不是在模型(PHP代码)中实现。

Smarty的最佳解决方案是实现此转换的write a Smarty pluginmodifier)。

这是一个简单的例子,说明这样一个修饰符的样子:

/**
 * Smarty modifier plugin
 *
 * @param string|array $range     input string or array
 * @param string       $separator the value to use as separator (e.g. '...')
 * @return string
 */
function smarty_modifier_range($range, $separator = '-')
{
    // If the input is a string (like "1,2,3,4"), convert it to an array
    if (is_string($range)) {
        $range = explode(',', $range);
    } elseif (! is_array($range)) {
        // If it's neither string, nor array then
        // this modifier has no effect on it
        return $range;
    }

    // A range must have at least two components
    if (count($range) < 2) {
        // It's not a range
        return implode(',', $range);
    }

    // Use only the first and the last item
    return reset($range).$separator.end($range);
}

为了使用它,你必须告诉Smarty在哪里找到它。为这个插件创建一个目录(也许你会写更多Smarty插件)并将该函数放在这个目录中名为modifier.range.php的文件中。

在Smarty对象初始化期间使用Smarty函数addPluginsDir()将此目录添加到查找插件的目录列表中。

$smarty = new Smarty();
$smarty->addPluginsDir(array('... the path of the new director here'));

修饰符接受包含以逗号分隔的值的数组和字符串。它从中提取第一个和最后一个组件(如果至少有两个组件)并通过可配置的分隔符返回它们(默认值:-):

$smarty->assign('var1', range(12, 16));
$smarty->assign('var2', array(7, 8, 9, 10, 11));
$smarty->assign('var3', '2,3,4,5,6');
$smarty->assign('var4', '4');
$smarty->assign('var5', array(5, 10, 15));
$smarty->assign('var6', array(3, 5, 6, 4));

在模板中:

{$var1|range}            // 12-16   (modify array)
{$var2|range:".."}       // 7..11   (use custom separator)
{$var3|range}            // 2..5    (modify string)
{$var4|range}            // 4       (there is no range here)
{$var5|range}            // 5-15    (doesn't verify for gaps)
{$var6|range}            // 3-4     (doesn't verify the order)

最后一个例子显示了插件的缺点,因为它暴露在上面。它不会验证输入数组或字符串中的值是否按升序排序。因此,如果它们尚未排序,则其输出不太正确。

但是,这是一个小问题,可以使用sort PHP函数轻松解决。

更新:可以在Github找到更精细的插件版本。

答案 1 :(得分:-1)

您确定您的变量是字符串而不是数组吗?

对于数组:您可以使用foreach循环来处理所有数组元素,但只显示第一个和最后一个项目。 这正是您所需要的: http://www.smarty.net/forums/viewtopic.php?p=3219

但对于一个字符串,你可以在“,”上将其爆炸以获取数组或regex_replace修饰符: http://www.smarty.net/docsv2/en/language.modifier.regex.replace.tpl

答案 2 :(得分:-2)

在java中你可以这样做:

List<String> splitedList = Arrays.asList(variable.split(","));
String finalString=splitedList.get(0)+"-"+splitedList.get(splitedList.size()-1);