str_replace 是PHP中一个非常基础且核心的字符串替换函数,织梦CMS作为基于PHP开发的系统,自然也完全支持它,它可以在服务器端处理字符串,实现内容替换、修改等操作。
str_replace 函数基础
我们回顾一下 str_replace 的基本语法和用法。
语法
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) : mixed
参数说明
$search(必需): 要查找的目标字符串(可以是字符串或数组)。$replace(必需): 用来替换的字符串(可以是字符串或数组)。$subject(必需): 被搜索和替换的原始字符串(可以是字符串或数组)。$count(可选): 如果这个变量被提供,它将被设置为执行的替换次数。
简单示例
// 示例1:简单的字符串替换
$str = "Hello, World!";
$new_str = str_replace("World", "DedeCMS", $str);
echo $new_str; // 输出: Hello, DedeCMS!
// 示例2:使用数组进行批量替换
$search = array("apple", "banana");
$replace = array("苹果", "香蕉");
$subject = "I like apple and banana.";
$new_str = str_replace($search, $replace, $subject);
echo $new_str; // 输出: I like 苹果 and 香蕉.
在织梦CMS中的常见应用场景
在织梦CMS中,str_replace 主要用于对文章内容、栏目名称、模板变量等进行动态处理。
场景1:在文章内容中替换特定词语
这是最常见的用法,比如你想将文章中所有的“织梦CMS”自动替换为“DedeCMS”,或者在文章末尾加上版权声明。
方法A:修改 include/arc.archives.class.php 文件(全局生效)
这是最经典、最常用的方法,因为它可以作用于所有文章的列表页和内容页,无需修改每个模板。
- 打开
/include/arc.archives.class.php文件。 - 找到
ParseDMFields函数(这个函数在生成文章HTML时被调用)。 - 在函数内部,找到
$this->Fields['body'] = $this->Fields['body'];这一行(通常在处理完内容后)。 - 在这一行之前,加入你的
str_replace代码。
示例代码:
// 在 include/arc.archives.class.php 文件中
// ... 其他代码 ...
function ParseDMFields($isMake = true)
{
// ... 其他代码 ...
// --- 在这里加入你的替换逻辑 ---
// 1. 将 "织梦CMS" 替换为 "DedeCMS"
$this->Fields['body'] = str_replace("织梦CMS", "DedeCMS", $this->Fields['body']);
// 2. 在文章末尾添加版权声明
$copyright_notice = "<div style='text-align:center; color:#999; margin-top:20px;'>本文版权归本站所有,转载请注明出处。</div>";
$this->Fields['body'] = $this->Fields['body'] . $copyright_notice;
// --- 替换逻辑结束 ---
// 这一行是原有的,不要删除
$this->Fields['body'] = $this->Fields['body'];
// ... 其他代码 ...
if($isMake)
{
$this->MakeHtml();
}
}
优点:
- 全局生效,一劳永逸。
- 不需要修改模板,维护方便。
缺点:
- 需要修改核心文件,升级织梦时可能会被覆盖。
- 对PHP代码不熟悉的新手可能操作有风险。
方法B:在文章内容页模板中使用
如果你只想在文章内容页(article_article.htm)进行替换,可以直接在模板文件里使用。
示例模板代码 (article_article.htm):
{dede:field.body function='str_replace("织梦CMS", "DedeCMS", @me)'/}
代码解释:
{dede:field.body/}:这是调用文章内容的标签。function='...':这是为标签内容附加一个PHP函数。str_replace("织梦CMS", "DedeCMS", @me):这里调用了str_replace函数。"织梦CMS":要查找的字符串。"DedeCMS":要替换成的字符串。@me:这是一个特殊变量,代表当前标签的原始值,也就是{dede:field.body/}的内容。
优点:
- 安全,不修改核心文件。
- 灵活,可以针对不同模板使用不同的替换规则。
缺点:
- 只在当前模板生效,如果列表页也需要,则需要在列表页模板(如
list_article.htm)中对{dede:field.description/}或其他字段也做类似处理。
场景2:在列表页/栏目页替换摘要或栏目名
同样的逻辑也适用于列表页。
示例:在列表页模板中替换文章摘要
打开列表页模板文件,/templets/default/list_article.htm,找到调用摘要的标签,并为其附加 function。
{dede:list pagesize='10'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>
<!-- 对摘要进行替换,将 "..." 替换为 "..." -->
[field:description function='str_replace("...", "...", @me)'/]...
</p>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
{/dede:list}
示例:替换栏目名称
如果你想动态改变栏目名称的显示,比如在特定栏目下给名称加上“[热门]”前缀。 页模板中:
{dede:field.typename function='str_replace("技术分享", "[热门]技术分享", @me)'/}
场景3:结合织梦其他函数使用
str_replace 的强大之处在于它可以和织梦的其他标签函数结合使用。
示例:移除文章内容中的所有 <img>
如果你想在调用文章摘要时,完全移除图片标签,可以使用正则表达式版的 preg_replace。
[field:description function='preg_replace("/<img[^>]+>/i", "", @me)'/]
示例:替换自定义字段内容
假设你有一个自定义字段 video_url,存储的是优酷的旧链接,你想在显示时将其替换为新的播放器地址。
{dede:field.video_url function='str_replace("http://v.youku.com/v_show/id_", "http://player.youku.com/embed/", @me)'/}
注意事项与最佳实践
-
性能考虑:
str_replace是一个非常快的函数,但如果在循环中对大量内容(比如生成上千篇文章)进行复杂替换,可能会对页面生成速度有轻微影响,对于常规使用,无需担心。 -
核心文件备份:如果你选择修改
arc.archives.class.php文件,务必备份原文件!这样在升级或出问题时可以恢复。 -
优先使用模板方法:如果替换逻辑只适用于特定页面,强烈建议使用模板的
function方法,它更安全、更灵活,符合模板与逻辑分离的思想。 -
大小写敏感:
str_replace是大小写敏感的。str_replace("Hello", "Hi", "hello world")不会发生任何替换,如果需要不区分大小写的替换,请使用str_ireplace函数。 -
转义字符:如果你的搜索或替换字符串中包含特殊字符(如 ,
\),请注意转义,或者使用单引号 来定义字符串,这样可以避免很多问题。
| 应用场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 全局文章内容替换(如加版权、统一品牌词) | 修改 include/arc.archives.class.php |
一劳永逸,全局生效 | 修改核心文件,升级可能被覆盖 |
| 特定页面内容替换(如只在内容页替换) | 在模板中使用 {dede:field.xxx function='...'} |
安全、灵活、不修改核心 | 需要在每个用到的模板里修改 |
| 列表页/栏目页替换 | 在对应模板中使用 function |
精准控制,不影响其他页面 | 同上,需逐模板修改 |
希望这份详细的讲解能帮助你熟练地在织梦CMS中使用 str_replace 函数!
