你好,我有一个智能变量,它的值有(数字、数字、数字),我想替换中间部分:
因此,我想首先和最后一个数字合并为一个"-“其余的应该删除。我怎么才能聪明地做到这一点呢?
提前感谢!
发布于 2016-12-18 13:24:29
马蒂是一个模板系统。它的主要目的是将从PHP代码(以变量形式)接收的数据表示为HTML或任何其他文本格式。
像您所需要的那样进行转换的最简单的方法是在PHP代码中准备它们,并将它们分配给变量。
另一方面,这种转换不是业务规则,而是表示细节;因此,必须在视图(Smarty)而不是在模型( PHP代码)中实现它。
Smarty的最佳解决方案是实现此转换的写一个聪明的插件 ( 修饰符)。
这是一个简单的例子,说明了这样的修饰符是怎样的:
/**
* 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()
将该目录添加到它查找插件的目录列表中。
$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
函数轻松地解决。
更新:在Github上可以找到更详细的插件版本。
发布于 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。
发布于 2016-12-17 21:17:26
在java中,您可以这样做:
List<String> splitedList = Arrays.asList(variable.split(","));
String finalString=splitedList.get(0)+"-"+splitedList.get(splitedList.size()-1);
https://stackoverflow.com/questions/41203032
复制相似问题