下面我将从内置函数、自定义函数以及实际应用场景三个方面,详细讲解如何在ECSHOP模板中过滤和截取字符串。

ECSHOP 内置函数(最常用)
ECSHOP 的模板引擎 (Smarty) 提供了一些内置的修饰符(Modifiers)来处理字符串,这些可以直接在模板文件(.dwt)中使用。
字符串截取
这是最核心的功能,用于限制显示的字符长度,避免标题过长破坏页面布局。
- 函数:
substr - 语法:
{$string|substr:0:20} - 参数说明:
string: 要处理的原始字符串(通常是变量,如{$goods.goods_name})。0: 开始截取的位置(0表示从第一个字符开始)。20: 要截取的字符长度。
- 示例:
<!-- 显示商品名称,最多显示20个字符 --> <h3>{$goods.goods_name|substr:0:20}</h3>
字符串过滤
过滤主要指去除不需要的字符,如HTML标签、多余的空格等。
-
函数:
strip_tags
(图片来源网络,侵删) -
语法:
{$string|strip_tags} -
功能: 去除字符串中的所有HTML和PHP标签,这对于显示纯文本摘要非常有用,防止恶意代码或标签破坏页面样式。
-
示例:
<!-- 显示商品简介,并去除所有HTML标签,只显示纯文本 --> <p class="desc">{$goods.goods_desc|strip_tags|substr:0:100}</p>注意:
strip_tags应该在substr之前使用,这样可以确保统计的是纯文本的字符数,而不是包含HTML标签的字符数。 -
函数:
trim -
语法:
{$string|trim} -
功能: 去除字符串首尾的空白字符(包括空格、换行、制表符等)。
自定义函数(更灵活、更强大)
当内置函数无法满足需求时(需要智能截断并添加省略号,或者需要去除特定字符),我们可以编写自定义的PHP函数,然后在模板中调用。
创建自定义函数
-
找到并修改
lib_main.php文件: 这个文件位于includes/目录下,是ECSHOP存放核心函数的地方,我们在这里添加自定义函数,可以确保在所有页面都可用。 -
添加一个智能截断函数: 下面是一个非常实用的函数,它可以截断字符串,并在最后添加省略号,同时能正确处理中文字符和HTML标签。
在
lib_main.php文件的末尾,?>之前,添加如下代码:/** * 智能截取字符串,支持中文和HTML标签 * * @param string $str 要处理的字符串 * @param int $length 截取长度 * @param string $etc 后缀 * @param bool $break_words 是否在单词边界处断开 * @param bool $middle 是否在字符串中间添加省略号 * @return string */ function smart_cut($str, $length = 80, $etc = '...', $break_words = false, $middle = false) { if ($length == 0) { return ''; } // 使用mbstring扩展来正确处理多字节字符(如中文) if (function_exists('mb_strlen')) { if (mb_strlen($str) > $length) { $length -= min($length, mb_strlen($etc)); if (!$break_words && !$middle) { $str = preg_replace('/\s+?(\S+)?$/', '', mb_substr($str, 0, $length + 1)); } if (!$middle) { return mb_substr($str, 0, $length) . $etc; } else { return mb_substr($str, 0, floor($length / 2)) . $etc . mb_substr($str, -floor($length / 2)); } } return $str; } else { // 如果没有mbstring扩展,则使用普通方法,可能无法正确处理中文 if (strlen($str) > $length) { $length -= min($length, strlen($etc)); if (!$break_words && !$middle) { $str = preg_replace('/\s+?(\S+)?$/', '', substr($str, 0, $length + 1)); } if (!$middle) { return substr($str, 0, $length) . $etc; } else { return substr($str, 0, floor($length / 2)) . $etc . substr($str, -floor($length / 2)); } } return $str; } }
在模板中使用自定义函数
在模板文件(如 category.dwt, goods.dwt)中,你可以像这样调用它:
<!-- 调用我们自定义的 smart_cut 函数 -->
<h3>{$goods.goods_name|smart_cut:20:'...'}</h3>
<!-- 显示商品描述,先去除HTML标签,再智能截取100个字符 -->
<p class="short-desc">{$goods.goods_desc|strip_tags|smart_cut:100:'[更多]'}</p>
这个 smart_cut 函数比原生的 substr 更强大,因为它:
- 支持中文: 使用
mb_substr正确处理多字节字符,避免乱码。 - 添加后缀: 自动在截断后添加 或你指定的任何后缀。
- 更智能: 可以选择在中间截断等。
实际应用场景示例
场景1:在商品分类页(category.dwt)中截取商品名称
假设商品名称很长,会影响列表布局。
原始代码:
<li><a href="{$goods.url}">{$goods.goods_name}</a></li>
修改后(截取15个字符):
<li><a href="{$goods.url}">{$goods.goods_name|substr:0:15}</a></li>
修改后(使用自定义函数,更美观):
<li><a href="{$goods.url}">{$goods.goods_name|smart_cut:15:'...'}</a></li>
场景2:在商品详情页(goods.dwt)中显示商品简介
商品详情通常包含大量HTML标签,我们只想显示一段纯文本摘要。
原始代码:
<div class="intro">{$goods.goods_desc}</div>
修改后(去除HTML标签,并截取100个字符):
<div class="intro">{$goods.goods_desc|strip_tags|substr:0:100}</div>
修改后(使用自定义函数,效果更好):
<div class="intro">{$goods.goods_desc|strip_tags|smart_cut:100:'...'}</div>
场景3:在首页(index.dwt)推荐商品中处理广告语
假设有一个 recommend_best 循环,需要截取广告语。
<!-- {foreach from=$recommend_best item=goods} -->
<div class="best-item">
<img src="{$goods.goods_img}" alt="{$goods.goods_name|escape:'html'}" />
<h4>{$goods.goods_name|smart_cut:12:'...'}</h4>
<p class="slogan">{$goods.goods_brief|strip_tags|smart_cut:30:'...'}</p>
</div>
<!-- {/foreach} -->
总结与最佳实践
- 优先使用内置函数: 对于简单的截取和过滤,直接使用
substr和strip_tags是最快、最简单的方法。 - 善用管道符 : Smarty的管道符可以让你将多个修饰符串联起来,非常灵活,
{$str|strip_tags|substr:0:100}。 - 编写自定义函数: 当你需要更复杂、更通用的逻辑时(如智能截断、自定义过滤规则),在
lib_main.php中编写自定义函数是最好的选择,这能保持模板文件的整洁,并将业务逻辑与表现层分离。 - 注意字符编码: 处理中文时,强烈建议使用
mbstring扩展的函数(如mb_strlen,mb_substr),以避免因编码问题导致的乱码或截断错误,上面的smart_cut函数已经考虑了这一点。 - 安全第一: 在输出用户提交的内容(如评论、商品简介)时,使用
strip_tags或htmlspecialchars(通过escape修饰符) 可以有效防止XSS攻击。{$comment.content|escape:'html'}。
