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

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

    ecshop模板过滤截取字符串
    (图片来源网络,侵删)
  • 语法: {$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函数,然后在模板中调用。

创建自定义函数

  1. 找到并修改 lib_main.php 文件: 这个文件位于 includes/ 目录下,是ECSHOP存放核心函数的地方,我们在这里添加自定义函数,可以确保在所有页面都可用。

  2. 添加一个智能截断函数: 下面是一个非常实用的函数,它可以截断字符串,并在最后添加省略号,同时能正确处理中文字符和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} -->

总结与最佳实践

  1. 优先使用内置函数: 对于简单的截取和过滤,直接使用 substrstrip_tags 是最快、最简单的方法。
  2. 善用管道符 : Smarty的管道符可以让你将多个修饰符串联起来,非常灵活,{$str|strip_tags|substr:0:100}
  3. 编写自定义函数: 当你需要更复杂、更通用的逻辑时(如智能截断、自定义过滤规则),在 lib_main.php 中编写自定义函数是最好的选择,这能保持模板文件的整洁,并将业务逻辑与表现层分离。
  4. 注意字符编码: 处理中文时,强烈建议使用 mbstring 扩展的函数(如 mb_strlen, mb_substr),以避免因编码问题导致的乱码或截断错误,上面的 smart_cut 函数已经考虑了这一点。
  5. 安全第一: 在输出用户提交的内容(如评论、商品简介)时,使用 strip_tagshtmlspecialchars (通过 escape 修饰符) 可以有效防止XSS攻击。{$comment.content|escape:'html'}