← 中文资源

简体中文版本

用户输入空白字符规范化

裁剪并合并用户文本中的空白,可选择保留换行,同时删除会干扰搜索与比较的零宽字符。

阅读英文原文

功能说明

从表单、剪贴板和日志复制来的文本常包含连续空格、制表符、零宽字符和混合换行。该函数统一清理这些噪声,可选择保留段落换行,便于搜索、比较和存储。默认模式把所有空白折叠为单个空格,保留换行模式则逐行处理。

关键代码

先删除零宽空格、零宽连接符和 BOM。preserveNewlines 为真时按 CRLF、CR 或 LF 拆行,逐行压缩水平空白并裁剪,再用 LF 连接;否则直接用 \s+ 合并全部空白。入口校验字符串类型,选项只接受显式 true。

if (preserveNewlines) {
  return withoutInvisible
    .split(/\r\n|\r|\n/)
    .map((line) => line.replace(/[ \t\f\v]+/g, " ").trim())
    .join("\n")
    .trim();
}

使用注意

该函数会改变文本内容,不适合保留缩进的代码或 Markdown。保留换行模式仍会删除行首行尾空格,并把连续空行保留为多个换行。零宽字符范围有限,其他 Unicode 控制字符不会被移除。输入必须是字符串,否则抛 TypeError。

验证方式

断言 normalizeWhitespace(” a \t b “) 返回 a b。normalizeWhitespace(“a\n\n b”, { preserveNewlines: true }) 返回 a\n\nb。含 \u200B 的文本应被清理。传入数字抛 TypeError,空字符串返回空字符串,单独的制表符应被折叠为空。