移动端br换p,适配与样式如何兼容?

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

问题根源分析

织梦在保存文章内容时,会通过其自带的过滤函数处理HTML代码,默认情况下,这些函数可能没有将连续的 <br> 标签智能地转换为 <p> 标签,当内容通过移动端App或微信等第三方平台发布时,它们生成的换行符就是 <br>

织梦移动端br换p
(图片来源网络,侵删)

解决方案

手动替换(最直接,但不可持续)

这种方法适合一次性处理少量旧文章。

  1. 进入织梦后台 -> -> 文档维护 -> 文档批量维护
  2. 选择你想要修改的文章(选择“所有文章”)。
  3. 在“批量维护”页面,找到“内容替换”功能。
  4. 在“查找内容”框中输入 <br>
  5. 在“替换为”框中输入 <p>
  6. 点击“开始执行”。

注意:这个方法非常粗暴,它会替换掉所有的 <br> 标签,包括那些本不该替换的(例如在表格内、列表项中的 <br>),可能会导致页面布局错乱。不推荐用于大规模数据


修改织DedeCMS核心文件(有风险,不推荐新手)

通过修改织梦处理内容的PHP文件,让它在发布或编辑时就自动完成转换。

  1. 找到核心文件: 文件路径为:/include/helpers/string.helper.php 这个文件是织梦处理字符串的核心助手文件。

    织梦移动端br换p
    (图片来源网络,侵删)
  2. 修改函数: 打开 string.helper.php 文件,找到 Html2Text() 函数,这个函数的作用是将HTML转换为纯文本,但我们可以利用它来修改HTML结构,更直接的方法是创建一个新的过滤函数。

    一个更安全、更推荐的做法是在发布内容时增加一个自定义的过滤步骤,我们可以修改发布文章的处理逻辑,例如在 /dede/article_add.php/dede/article_edit.php 中,在内容入库前进行处理。

    article_add.php 中查找类似这样的代码:

    $body = cn_substr_utf8($body, $cfg_max_input_length);
    $body = GetEditorContent($body, $description);

    在它后面插入以下代码:

    织梦移动端br换p
    (图片来源网络,侵删)
    // 将连续的 <br> 替换为 <p>
    $body = preg_replace('/(<br\s*\/?>\s*){2,}/i', '</p><p>', $body);
    // 确保内容被 <p> 标签包裹
    if (strpos($body, '<p') !== 0) {
        $body = '<p>' . $body . '</p>';
    }
    // 清理空的 p 标签
    $body = preg_replace('/<p>\s*<\/p>/i', '', $body);
  3. 风险提示

    • 覆盖风险:织梦升级会覆盖这些修改,需要重新修改。
    • 兼容性风险:修改核心文件可能导致与其他插件或模板不兼容。
    • 逻辑复杂性:正则表达式可能无法覆盖所有边界情况,导致转换不完美。

鉴于以上风险,此方案仅适用于有经验的开发者,并且需要对修改后的系统进行充分测试。


最佳实践 - 使用自定义函数和钩子(推荐)

这是最专业、最灵活、最安全的方法,我们创建一个自定义函数,并在内容输出前调用它,而不是修改核心文件。

步骤1:创建自定义函数文件

/include/ 目录下创建一个新文件,my_functions.php

my_functions.php 中写入以下函数:

<?php
/**中的连续 <br> 标签转换为 <p> 标签
 * @param string $content 原始HTML内容
 * @return string 处理后的HTML内容
 */
function brToP($content) {
    // 1. 将连续的 <br> 替换为段落分隔符
    // <br><br> -> </p><p>
    // 注意:这里的正则表达式匹配2个或以上的<br>标签
    $content = preg_replace('/(<br\s*\/?>\s*){2,}/i', '</p><p>', $content);
    // 2. 为内容块包裹 <p> 标签
    // 匹配不以 <p> 开头,但包含换行或空块的内容
    $content = preg_replace('/(?!^)<(?!p\b)[^>]*>(.*?)(?=<[^>]*>|$)/si', '<p>$1</p>', $content);
    // 3. 清理空的 <p> 标签
    $content = preg_replace('/<p>\s*<\/p>/i', '', $content);
    // 4. 处理可能存在的孤立标签
    // 确保段落内容前后都有标签
    $content = preg_replace('/<p>(.*?)<br\s*\/?>(.*?)<\/p>/i', '<p>$1 $2</p>', $content);
    return $content;
}

注意:上面的正则表达式是一个通用方案,可能无法100%完美处理所有复杂的HTML结构,你可以根据你的实际内容格式进行调整。

步骤2:引入自定义函数文件

打开织梦的全局函数文件 /include/common.php,在文件末尾 ?> 之前,加入以下代码:

// 引入自定义函数
require_once(DEDEINC . '/my_functions.php');

这确保了每次加载织梦时,你的自定义函数都会被加载。

步骤3:在模板中调用函数

你可以在你的模板文件(article_article.htm)中,使用织梦的 {dede:field.body/} 标签来输出文章内容,并用我们刚创建的函数包裹它。

打开你的文章内容模板文件(通常在 /templets/default/ 或你的自定义模板目录下),找到 {dede:field.body/} 这一行。

修改前:

<div class="article-content">
    {dede:field.body/}
</div>

修改后:

<div class="article-content">
    {dede:field.body function='brToP(@me)'/}
</div>

代码解释

  • function='brToP(@me)' 是织梦模板的一个强大功能。
  • @me 是一个特殊变量,代表 {dede:field.body/} 标签当前输出的原始内容。
  • brToP(@me) 的意思是:将 @me(即原始文章内容)作为参数,传递给我们之前在 my_functions.php 中定义的 brToP() 函数。
  • 函数处理后的返回值,就会成为 {dede:field.body/} 的最终输出。

总结与推荐

方案 优点 缺点 推荐度
手动替换 简单直接,无需代码 效率低,易出错,不可持续 ⭐☆☆☆☆ (仅限应急)
修改核心文件 一次性修改,所有地方生效 风险高,升级会丢失,可能引发新问题 ⭐☆☆☆☆ (不推荐)
自定义函数 安全、灵活、可维护、不影响升级 需要少量代码编写 ⭐⭐⭐⭐⭐ (强烈推荐)

强烈建议你使用方案三,它遵循了“不修改核心文件”的最佳实践,让你的网站在升级时更加安全,并且逻辑清晰,易于管理和扩展。

-- 展开阅读全文 --
头像
织梦文章发布时间段如何设置最合适?
« 上一篇 04-30
C语言如何求1到10的阶乘?
下一篇 » 04-30

相关文章

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

目录[+]