首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Smarty:替换字符串的中间部分

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

Stack Overflow用户
提问于 2016-12-17 21:02:30
回答 3查看 525关注 0票数 1

你好,我有一个智能变量,它的值有(数字、数字、数字),我想替换中间部分:

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

因此,我想首先和最后一个数字合并为一个"-“其余的应该删除。我怎么才能聪明地做到这一点呢?

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2016-12-18 13:24:29

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

像您所需要的那样进行转换的最简单的方法是在PHP代码中准备它们,并将它们分配给变量。

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

Smarty的最佳解决方案是实现此转换的写一个聪明的插件 ( 修饰符)。

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

代码语言:javascript
运行
复制
/**
 * 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在哪里找到它。为这个插件创建一个目录(也许您会编写更多的智能插件),并将函数放在这个目录中的一个名为modifier.range.php的文件中。

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

代码语言:javascript
运行
复制
$smarty = new Smarty();
$smarty->addPluginsDir(array('... the path of the new director here'));

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

代码语言:javascript
运行
复制
$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));

在模板中:

代码语言:javascript
运行
复制
{$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函数轻松地解决。

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

票数 1
EN

Stack Overflow用户

发布于 2016-12-18 00:57:12

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

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

但是对于字符串,您可以使用",“来获得数组或regex_replace修饰符:http://www.smarty.net/docsv2/en/language.modifier.regex.replace.tpl

票数 -1
EN

Stack Overflow用户

发布于 2016-12-17 21:17:26

在java中,您可以这样做:

代码语言:javascript
运行
复制
List<String> splitedList = Arrays.asList(variable.split(","));
String finalString=splitedList.get(0)+"-"+splitedList.get(splitedList.size()-1);
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41203032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档