织梦模板正则替换内容方法
应用场景
织梦模板中常需要对字段内容做二次处理,例如:替换图片路径、给关键词加内链、清理广告代码、移除特定 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 实体(如
& 被错误替换)。涉及 HTML 结构的替换优先用 DOMDocument 解析。3.
preg_replace 使用 /e 修饰符在 PHP 7+ 已废弃,必须改用 preg_replace_callback。4. 关键词内链替换要排除已有 a 标签内部的内容,否则会出现链接嵌套错误。
5. 大量正则叠加会影响页面生成性能,建议合并为单条多规则模式,或在静态生成时一次性处理。
后续优化方向
对于内容量大、规则复杂的站点,建议将正则替换逻辑沉淀为独立的“内容过滤器”类,支持后台配置规则、按栏目启用不同规则集。同时结合静态缓存机制,将处理后的结果直接写入 HTML,避免每次访问都执行正则。可定期用站长工具抽样检查替换效果,及时调整规则防止误伤正文。