织梦 正则表达式 替换

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 织梦建站 正文

织梦CMS 主要在两个地方使用正则表达式进行替换:

织梦 正则表达式 替换
(图片来源网络,侵删)
  1. 后台核心设置 - 内容替换:这是最常用、最安全的方式,主要用于批量替换已发布文章内容中的文本、链接、图片等。
  2. 修改PHP源码:这种方式更强大,可以修改程序逻辑或模板解析过程,但有一定风险,不推荐普通用户轻易尝试。

下面我们分别详细介绍这两种方法。


后台核心设置 - 内容替换(推荐)

这是织梦官方提供的功能,专门用于内容维护,非常安全,不会影响程序文件。

操作步骤:

  1. 登录织梦后台:使用你的管理员账号登录网站后台。

  2. 进入功能菜单:在左侧菜单栏中,找到并点击 【核心】 -> 替换】

    织梦 正则表达式 替换
    (图片来源网络,侵删)
  3. 设置替换规则替换页面,你需要填写以下几个关键信息:

    • 来源: 选择你要替换的内容范围。
      • 内容关键字:替换文章正文 (body) 中的内容。
      • 标题关键字:替换文章标题 (title) 中的内容。
      • 自定义关键字:替换自定义字段(如 description, keywords 等)中的内容。
      • 全站:这是一个非常强大的选项,它会遍历你网站数据库中所有文章的标题、正文和自定义字段。请谨慎使用!
    • 查询: (可选)如果你只想替换符合某些条件的文章,可以在这里设置,你可以指定某个栏目ID、某个时间范围或者某个特定作者的文章,这样可以缩小替换范围,避免误操作。
    • 这里输入你想要被替换掉的文本。这里必须填写正则表达式
    • 替换为: 这里输入你希望替换成的新文本,如果只是普通替换,直接写文本即可,如果要用到正则的“反向引用”,则需使用 $1, $2 等符号。
  4. 执行替换:填写完毕后,点击底部的 【开始执行替换】 按钮,织梦会先列出将要执行替换的文章数量,让你确认无误后,再真正执行数据库更新。

正则表达式示例(重点)

输入框中,你需要使用符合 PHP preg_replace 函数语法的正则表达式。

示例 1:替换固定的文本或链接(最常用)

织梦 正则表达式 替换
(图片来源网络,侵删)
  • 需求:将文章中所有旧的网站域名 www.old-domain.com 替换为新的 www.new-domain.com
  • www.old-domain.com
    • 说明:虽然这不是一个复杂的正则,但在这里也能工作,更严谨的写法是:www\.old-domain\.com
  • 替换为www.new-domain.com
  • 来源:选择“全站”或“内容关键字”。

示例 2:使用正则匹配并反向引用(高级用法)

  • 需求:将文章内所有指向旧域名图片的链接(如 <img src="http://www.old-domain.com/images/1.jpg">)中的域名部分替换掉,但保留图片路径。

  • src="(http://www\.old-domain\.com)(.*?)"src="([^"]*?old-domain\.com)([^"]*?)"

    • 说明
      • src="...":匹配 src 属性。
      • (http://www\.old-domain\.com):这是一个捕获组,用括号 包起来,匹配完整的旧域名,这里的 需要转义为 \.
      • 这是第二个捕获组,非贪婪匹配任意字符(除换行符),直到引号前,代表图片路径。
      • 匹配结尾的引号。
  • 替换为src="$1$new-images-path$2"

    • 说明
      • $1:代表第一个捕获组的内容,即 http://www.old-domain.com
      • $new-images-path:你直接写新的路径,/uploads/
      • $2:代表第二个捕获组的内容,即原来的图片路径 /images/1.jpg
    • 最终效果<img src="/uploads/images/1.jpg">,这个例子有点复杂,我们来看一个更清晰的。
  • 需求:统一修改文章内所有外部链接,给它们加上 rel="nofollow" 属性。

  • href="(http://[^"]+)"href="(https?://[^"]+)"

    • 说明
      • href="...":匹配 href 属性。
      • (http://[^"]+):捕获组,匹配以 http:// 开头,后面是除 之外的任意一个或多个字符。
  • 替换为href="$1" rel="nofollow"

    • 说明$1 保留了原始的链接地址,然后在后面追加了 rel="nofollow"

示例 3:删除特定的HTML标签

  • 需求:删除文章中所有的 <font> 标签及其内容(<font color="red">这些文字</font>)。
  • <font.*?>.*?</font>
    • 说明
      • <font:匹配标签开始。
      • 非贪婪匹配任意字符,用于匹配标签内的属性(如 color="red")。
      • >:匹配标签结束符。
      • 非贪婪匹配标签内的所有文字内容。
      • </font>:匹配标签结束。
  • 替换为:(留空)
    • 说明:替换为空字符串,就是删除。

修改PHP源码(高风险,谨慎操作)

这种方法适用于模板级别的、全局性的替换,或者后台功能无法满足的复杂需求。操作前务必备份相关文件!

常见应用场景:

  • 修改 include/common.inc.php 文件,在全局引入一个JS或CSS文件。
  • 修改文章内容输出前的处理逻辑,比如在 arc.archives.class.php 中。
  • 修改列表页、首页等模板的解析过程。

操作步骤(以修改文章内容输出为例):

  1. 定位文件:找到处理文章内容的PHP文件,通常是 include/arc.archives.class.php,这个文件是文章内容发布的核心类。
  2. 查找代码位置:打开这个文件,搜索 bodyMakeHtml 等关键词,找到文章内容被处理和输出的地方,通常在 GetBody 方法或类似方法中。
  3. 添加正则替换代码被最终输出之前,使用 PHP 的 preg_replace() 函数进行替换。

代码示例:

假设我们要在 arc.archives.class.php 文件的 GetBody() 方法中,对所有文章内容进行替换。

// 在 arc.archives.class.php 文件中
// 找到类似这样的代码段
// ... 其他代码 ...
function GetBody()
{
    $this->Fields['body'] = $this->Fields['body'];
    // ... 其他处理代码 ...
    // 【在这里添加你的正则替换代码】
    // 需求:将所有 "织梦CMS" 替换为 "DedeCMS"
    $this->Fields['body'] = preg_replace('/织梦CMS/', 'DedeCMS', $this->Fields['body']);
    // 需求:删除所有 <script> 标签及其内容
    $this->Fields['body'] = preg_replace('/<script.*?>.*?<\/script>/is', '', $this->Fields['body']);
    return $this->Fields['body'];
}
// ... 其他代码 ...

代码解释:

  • preg_replace(pattern, replacement, subject):PHP 内置函数。
  • pattern:正则表达式,同方法一。
  • replacement:替换成的字符串。
  • $this->Fields['body']:这是当前文章的正文内容,我们直接对这个变量进行操作。

重要注意事项

  1. 备份数据:在进行任何批量替换(尤其是“全站”替换)之前,务必备份数据库,一旦替换错误,可以恢复。
  2. 测试:如果不确定正则表达式是否正确,可以先在“内容替换”页面选择少量文章(比如指定一个测试栏目)进行测试,确认效果无误后再全站执行。
  3. 正则语法:织梦后台使用的正则表达式是 PCRE(Perl Compatible Regular Expressions) 语法,与 PHP 的 preg_replace 函数一致。
    • :匹配除换行符外的任意单个字符。
    • :匹配前面的子表达式零次或多次。
    • :匹配前面的子表达式一次或多次。
    • :匹配前面的子表达式零次或一次,或用于非贪婪匹配。
    • :标记一个子表达式的开始和结束,用于分组,也是“反向引用”的标记。
    • :选择,匹配 两边的任意一个表达式。
    • [] :字符集合,匹配方括号内的任意一个字符。
    • [^] :否定字符集合,匹配不在方括号内的任意一个字符。
    • \ :转义字符,用于匹配特殊字符本身(如 \. 匹配点号)。
    • ^ :匹配字符串的开始。
    • :匹配字符串的结束。
  4. 性能考虑:正则表达式替换,特别是对全站内容进行复杂正则替换,可能会对服务器造成一定的压力,建议在网站访问量较低的时候进行操作。
特性 替换 修改PHP源码
使用场景 批量修改已发布的文章内容、标题、链接等。 模板全局修改、程序逻辑修改、后台功能无法满足的需求。
安全性 ,不涉及程序文件,只操作数据库。 ,修改核心文件,可能导致网站出错。
操作难度 ,图形化界面,只需填写正则。 ,需要懂PHP代码和文件结构。
灵活性 ,主要针对内容。 极高,可以控制程序的任何环节。
推荐度 强烈推荐,90%的内容替换需求都能满足。 不推荐,仅限高级用户在必要时使用。

对于绝大多数用户来说,方法一(后台核心设置 - 内容替换) 是最佳选择,请熟练掌握它的正则表达式用法,就能解决大部分内容维护问题。

-- 展开阅读全文 --
头像
C语言if循环中continue的作用是什么?
« 上一篇 01-10
织梦黑绿清新模板,如何适配多场景内容?
下一篇 » 01-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]