为什么很多帖子都有<br/>出现在正文内容中? Nodejs相关讨论

为什么很多帖子都有<br/>出现在正文内容中? Nodejs相关讨论

论坛新手,不知道为什么很多帖子都有这个问题。

5 回复

为什么很多帖子都有 <br/> 出现在正文内容中? Nodejs相关讨论

问题描述

最近在浏览一些使用 Node.js 搭建的论坛时,发现很多帖子的正文内容中出现了 <br/> 标签。这看起来很不美观,并且可能影响用户体验。作为论坛的新手,我很好奇这是什么原因导致的。

原因分析

<br/> 标签通常用于 HTML 中表示换行。然而,在某些情况下,这些标签可能会意外地出现在文本内容中。以下是一些可能导致这种情况的原因:

  1. 用户输入错误

    • 用户在编辑帖子时,不小心将 Markdown 或其他格式化语法误用为 HTML 标签。
    • 例如,用户本意想使用 Markdown 的换行符(即两个空格后跟一个换行),但却误用了 HTML 的 <br/> 标签。
  2. 富文本编辑器配置问题

    • 使用富文本编辑器时,如果没有正确配置,用户可能会无意间插入 HTML 标签。
    • 示例:如果使用了 tinymce 编辑器,但没有禁用 HTML 输入功能,用户可能会直接输入 HTML 标签。
  3. 服务器端处理不当

    • 在处理用户提交的数据时,服务器端没有正确过滤或转义 HTML 标签。
    • 示例:在保存数据到数据库之前,没有对用户输入进行转义处理。

示例代码

假设我们有一个简单的 Node.js 应用,使用 Express 和 MongoDB。以下是可能导致 <br/> 标签出现的一些代码片段:

const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

// 定义一个简单的 Post 模型
const postSchema = new mongoose.Schema({
    content: String
});

const Post = mongoose.model('Post', postSchema);

// 创建一个新的帖子
app.post('/posts', async (req, res) => {
    const { content } = req.body;
    // 直接保存用户输入的内容
    const newPost = new Post({ content });
    await newPost.save();
    res.send(newPost);
});

// 启动服务器
mongoose.connect('mongodb://localhost/myforum', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => {
        app.listen(3000, () => console.log('Server is running on port 3000'));
    });

在这个例子中,用户输入的内容被直接保存到数据库中,而没有进行任何处理。如果用户在输入时不小心插入了 <br/> 标签,那么这些标签就会被原样保存并显示在页面上。

解决方案

为了避免 <br/> 标签出现在内容中,可以采取以下措施:

  1. 过滤和转义用户输入
    • 使用库如 sanitize-html 来过滤和转义用户输入。
    • 示例代码:
      const sanitizeHtml = require('sanitize-html');
      
      app.post('/posts', async (req, res) => {
          const { content } = req.body;
          // 转义和过滤用户输入
          const safeContent = sanitizeHtml(content, {
              allowedTags: [],
              allowedAttributes: {}
          });
      
          const newPost = new Post({ content: safeContent });
          await newPost.save();
          res.send(newPost);
      });
      

通过上述措施,可以有效避免 <br/> 标签等不必要的 HTML 标签出现在用户帖子的内容中,从而提升用户体验。


论坛以前的 Markdown 支持不好, 更早论坛上的内容只是个博客… 各种历史遗留问题,

个人感觉虽然是历史遗留问题,但是对新手还是不太友好,大概看了一下后面几页的基本都这样

嗯, 对于用户体验来说影响是挺大的, 我觉得遇到这个也只能依靠手改了 总之工作量挺大的, 期待哪位能力高把开放编辑功能做出来, 表示可以付出时间手改

当你在Node.js应用中生成HTML内容时,有时候会遇到<br/>标签出现在文本中的情况。这通常是因为你在处理字符串数据时没有正确地转义HTML标签,导致它们被当作实际的HTML标签解析并显示出来。

原因

  1. 直接插入未处理的数据:如果你直接将用户输入的数据插入到HTML页面中,并且没有进行任何处理,那么HTML标签(如<br/>)会被浏览器解析为实际的标签。
  2. 使用模板引擎不当:如果你使用了像EJS、Pug这样的模板引擎,并且没有正确地处理数据,也会导致这种情况。

解决方法

解决这个问题的一种常见方法是使用模板引擎时确保对数据进行适当的转义。以下是几种常见的解决方法:

方法一:使用模板引擎的内置转义功能

如果你使用的是EJS模板引擎,可以使用<%-来输出未转义的HTML内容,而使用<%=来输出转义后的HTML内容。

<!-- 输出转义后的HTML内容 -->
<p><%= userContent %></p>

<!-- 输出未转义的HTML内容 -->
<p><%- userContent %></p>

确保你在大多数情况下使用<%= userContent %>来避免意外地将HTML标签插入到页面中。

方法二:手动转义

如果你不使用模板引擎,或者需要在后端进行处理,你可以手动转义HTML标签。以下是一个简单的JavaScript函数,用于转义HTML标签:

function escapeHtml(unsafe) {
    return unsafe
         .replace(/&/g, "&amp;")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
}

然后在你的应用中使用它:

const userContent = "<p>Hello<br/>World</p>";
const safeContent = escapeHtml(userContent);
// safeContent 现在变成了 &lt;p&gt;Hello&lt;br /&gt;World&lt;/p&gt;

通过上述方法,你可以有效避免<br/>等HTML标签直接出现在你的页面中。

回到顶部