DedeCMS 技术问答

织梦模板正则替换内容方法

应用场景

织梦模板中常需要对字段内容做二次处理,例如:替换图片路径、给关键词加内链、清理广告代码、移除特定 HTML 标签等。这些场景都可以通过 function 属性配合 PHP 正则函数 preg_replace 来实现,无需修改核心文件。

掌握模板正则替换,能大幅减少二次开发工作量,让模板层承担更多表现逻辑。

基本语法

织梦字段调用支持 function 参数,将字段值传入指定函数后输出:

{dede:field.body function="函数名(@me)"/}

其中 @me 代表当前字段的值。可以直接调用 PHP 内置函数,也可调用自定义函数。

调用 PHP 内置函数

{dede:field.body function="preg_replace('/<script[^>]*>.*?<\/script>/is','',@me)"/}

作用:移除正文中的所有 script 标签,防止投稿内容携带恶意脚本。

典型正则替换示例

示例 1:图片路径补全域名

织梦默认上传图片为相对路径 /uploads/...,移动端或独立域名调用时需要补全:

{dede:field.body function="preg_replace('/src=\"\//','src=\"https://www.example.com/',@me)"/}

示例 2:自动给关键词加内链

对正文中的指定关键词包裹 a 标签,提升内链密度:

// 写入 /include/extend.func.php
function AddInnerLink($content) {
    $keywords=[
        '织梦CMS'=> 'https://www.example.com/dede/',
        'DedeCMS'=> 'https://www.example.com/dede/',
    ];
    foreach ($keywords as $word=> $url) {
        // 仅替换首次出现,避免链接嵌套
        $content=preg_replace(
            '/(?!<[^>]*>)(' . preg_quote($word, '/') . ')(?![^<]*>)/',
            '<a href="'.$url.'">$1</a>',
            $content, 1
        );
    }
    return $content;
}

模板调用:

{dede:field.body function="AddInnerLink(@me)"/}

示例 3:清理 office 粘贴垃圾样式

{dede:field.body function="preg_replace('/\sclass=\"Mso[^"]*\"/','',@me)"/}

示例 4:移除指定 HTML 标签但保留内容

{dede:field.body function="preg_replace('/<\/?(div|span)[^>]*>/','',@me)"/}

多规则组合写法

当需要同时应用多条替换规则时,可在自定义函数中串行调用,避免模板层函数嵌套过深:

function CleanBody($content) {
    // 1. 移除 script
    $content=preg_replace('/<script[^>]*>.*?<\/script>/is', '', $content);
    // 2. 清理 Office 样式
    $content=preg_replace('/\s(class|style)="Mso[^"]*"/', '', $content);
    // 3. 图片路径补全
    $content=preg_replace('/src="\//', 'src="https://www.example.com/', $content);
    return $content;
}

注意事项

1. 正则中 " 双引号会与织梦标签的属性引号冲突,建议整个 function 用单引号包裹,正则内字符串用双引号或转义。
2. 正则替换是字符串层操作,会破坏 HTML 实体(如 &amp; 被错误替换)。涉及 HTML 结构的替换优先用 DOMDocument 解析。
3. preg_replace 使用 /e 修饰符在 PHP 7+ 已废弃,必须改用 preg_replace_callback
4. 关键词内链替换要排除已有 a 标签内部的内容,否则会出现链接嵌套错误。
5. 大量正则叠加会影响页面生成性能,建议合并为单条多规则模式,或在静态生成时一次性处理。

后续优化方向

对于内容量大、规则复杂的站点,建议将正则替换逻辑沉淀为独立的“内容过滤器”类,支持后台配置规则、按栏目启用不同规则集。同时结合静态缓存机制,将处理后的结果直接写入 HTML,避免每次访问都执行正则。可定期用站长工具抽样检查替换效果,及时调整规则防止误伤正文。