文本处理是日常开发和内容创作中最常见的需求之一。从统计文章字数到生成 SEO 友好的 URL,从转换命名风格到编辑 Markdown 文档,高效的文本处理工具能够大幅提升工作效率。本文将全面介绍 QubitTool 提供的六款文本处理工具,深入讲解其技术原理与最佳实践。
TL;DR
- 文本分析器:统计字数、字符数、阅读时间,分析词频密度
- 大小写转换器:支持 13 种命名风格转换,包括 camelCase、snake_case 等
- Markdown 编辑器:实时预览、导出 HTML、支持完整语法
- Slug 生成器:创建 SEO 友好的 URL 别名,支持中文拼音转换
- 重复行删除器:快速去重,支持忽略大小写和排序
- 数字转文字:将数字转换为英文单词,支持序数词和货币格式
文本分析器:深入理解你的文本
功能概述
文本分析器是内容创作者和开发者的必备工具,它能够即时分析文本的各项统计数据:
| 统计指标 | 说明 |
|---|---|
| 字符数 | 包含/不含空格两种统计 |
| 词数 | 智能识别中英文混合文本 |
| 句子数 | 基于句末标点识别 |
| 段落数 | 基于空行分隔识别 |
| 阅读时间 | 基于平均阅读速度计算 |
| 演讲时间 | 基于平均语速计算 |
| 词频分析 | 显示出现频率最高的词汇 |
阅读时间计算原理
阅读时间的计算需要考虑不同语言的阅读速度差异:
// 不同语言的阅读速度(词/分钟)
const readingSpeed = {
chinese: 300, // 中文:300字/分钟
english: 200, // 英文:200词/分钟
};
// 演讲速度(词/分钟)
const speakingSpeed = {
chinese: 200, // 中文:200字/分钟
english: 150, // 英文:150词/分钟
};
function calculateReadingTime(text) {
const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
const englishWords = text
.replace(/[\u4e00-\u9fa5]/g, ' ')
.trim()
.split(/\s+/)
.filter(w => /[a-zA-Z]/.test(w)).length;
const readingMinutes = Math.ceil(
(chineseChars / readingSpeed.chinese) +
(englishWords / readingSpeed.english)
);
return readingMinutes;
}
词频分析算法
词频分析对于 SEO 优化和内容质量评估非常重要:
function analyzeWordFrequency(text) {
const wordFreq = {};
// 处理英文单词
const englishWords = text
.toLowerCase()
.match(/[a-zA-Z]+/g) || [];
englishWords.forEach(word => {
wordFreq[word] = (wordFreq[word] || 0) + 1;
});
// 处理中文(二元组 + 单字)
const chineseText = text.match(/[\u4e00-\u9fa5]+/g)?.join('') || '';
// 二元组统计
for (let i = 0; i < chineseText.length - 1; i++) {
const bigram = chineseText.substring(i, i + 2);
wordFreq[bigram] = (wordFreq[bigram] || 0) + 1;
}
// 单字统计
chineseText.split('').forEach(char => {
wordFreq[char] = (wordFreq[char] || 0) + 1;
});
// 返回频率最高的词汇
return Object.entries(wordFreq)
.sort((a, b) => b[1] - a[1])
.slice(0, 10);
}
关键词密度计算
关键词密度是 SEO 优化的重要指标,建议保持在 1%-3% 之间:
function calculateKeywordDensity(text, keyword) {
const totalWords = text.split(/\s+/).length;
const keywordCount = (text.match(new RegExp(keyword, 'gi')) || []).length;
return ((keywordCount / totalWords) * 100).toFixed(2) + '%';
}
实际应用场景
- 内容创作:检查文章长度是否符合 SEO 要求(建议 1500+ 词)
- 演讲准备:根据演讲时间估算稿件长度
- 学术写作:确保论文符合字数要求
- 社交媒体:检查内容是否超出平台限制
大小写转换器:掌握命名规范
支持的转换类型
大小写转换器支持 13 种常见的命名风格转换:
| 类型 | 示例 | 常用场景 |
|---|---|---|
| lowercase | hello world | 通用文本 |
| UPPERCASE | HELLO WORLD | 常量、强调 |
| Title Case | Hello World | 标题、专有名词 |
| Sentence case | Hello world | 句子首字母 |
| camelCase | helloWorld | JavaScript 变量 |
| PascalCase | HelloWorld | 类名、组件名 |
| snake_case | hello_world | Python、数据库 |
| kebab-case | hello-world | URL、CSS 类名 |
| CONSTANT_CASE | HELLO_WORLD | 常量定义 |
| dot.case | hello.world | 配置项 |
| path/case | hello/world | 文件路径 |
| aLtErNaTe | hElLo WoRlD | 特殊效果 |
| iNVERSE | HELLO world | 反转大小写 |
转换算法实现
const caseConverters = {
// 驼峰命名:首字母小写,后续单词首字母大写
camelCase: (text) => text
.toLowerCase()
.replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
.replace(/^[A-Z]/, (c) => c.toLowerCase()),
// 帕斯卡命名:所有单词首字母大写
pascalCase: (text) => text
.toLowerCase()
.replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
.replace(/^[a-z]/, (c) => c.toUpperCase()),
// 蛇形命名:小写字母,下划线分隔
snakeCase: (text) => text
.replace(/([a-z])([A-Z])/g, '$1_$2')
.replace(/[\s-]+/g, '_')
.toLowerCase(),
// 短横线命名:小写字母,短横线分隔
kebabCase: (text) => text
.replace(/([a-z])([A-Z])/g, '$1-$2')
.replace(/[\s_]+/g, '-')
.toLowerCase(),
// 常量命名:大写字母,下划线分隔
constantCase: (text) => text
.replace(/([a-z])([A-Z])/g, '$1_$2')
.replace(/[\s-]+/g, '_')
.toUpperCase(),
// 标题格式:每个单词首字母大写
titleCase: (text) => text
.replace(/\w\S*/g, (txt) =>
txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
),
// 句子格式:句首字母大写
sentenceCase: (text) => text
.toLowerCase()
.replace(/(^\s*\w|[.!?]\s*\w)/g, (c) => c.toUpperCase()),
};
编程语言命名规范
不同编程语言有不同的命名习惯:
| 语言 | 变量 | 常量 | 类/组件 | 函数 |
|---|---|---|---|---|
| JavaScript | camelCase | CONSTANT_CASE | PascalCase | camelCase |
| Python | snake_case | CONSTANT_CASE | PascalCase | snake_case |
| Java | camelCase | CONSTANT_CASE | PascalCase | camelCase |
| Go | camelCase | PascalCase | PascalCase | camelCase |
| Rust | snake_case | CONSTANT_CASE | PascalCase | snake_case |
| CSS | kebab-case | - | - | - |
最佳实践
- 保持一致性:项目内使用统一的命名风格
- 语义化命名:名称应该清晰表达用途
- 避免缩写:除非是广泛认可的缩写
- 遵循框架规范:如 React 组件使用 PascalCase
Markdown 编辑器:高效文档编写
功能特性
Markdown 编辑器提供专业的 Markdown 编辑体验:
- 实时预览:边写边看,所见即所得
- 多种视图模式:纯编辑、分屏、纯预览
- 导出功能:下载 .md 文件或导出完整 HTML
- 语法高亮:代码块自动高亮
- 统计信息:实时显示字数、字符数、行数
Markdown 核心语法
标题
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
文本格式
**粗体文本**
*斜体文本*
~~删除线~~
`行内代码`
列表
无序列表:
- 项目一
- 项目二
- 子项目
有序列表:
1. 第一步
2. 第二步
3. 第三步
链接和图片
[链接文本](https://example.com)

代码块
```javascript
function hello() {
console.log('Hello, World!');
}
```
表格
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| A1 | B1 | C1 |
| A2 | B2 | C2 |
引用
> 这是一段引用文本
> 可以跨越多行
Markdown 渲染原理
Markdown 到 HTML 的转换基于解析器实现:
import MarkdownIt from 'markdown-it';
const md = new MarkdownIt({
html: true, // 允许 HTML 标签
linkify: true, // 自动识别链接
typographer: true, // 智能引号
breaks: true, // 换行转 <br>
});
const html = md.render(markdownText);
高级技巧
-
任务列表:
markdown- [x] 已完成任务 - [ ] 待完成任务 -
脚注:
markdown这是一个脚注[^1] [^1]: 脚注内容 -
数学公式(需要扩展支持):
markdown行内公式:$E = mc^2$ 块级公式:$$\sum_{i=1}^n a_i$$
Slug 生成器:SEO 友好的 URL
什么是 Slug?
Slug 是 URL 中用于标识页面的人类可读部分。例如:
https://example.com/blog/my-first-blog-post
↑
这就是 Slug
为什么 Slug 对 SEO 重要?
- 搜索引擎理解:描述性 URL 帮助搜索引擎理解页面内容
- 用户体验:用户可以从 URL 预判页面内容
- 分享友好:简洁的 URL 更易于分享和记忆
- 点击率提升:搜索结果中显示的 URL 影响点击决策
Slug 生成规则
Slug 生成器遵循以下规则:
function generateSlug(text, options) {
let slug = text;
// 1. 去除首尾空白
if (options.trimWhitespace) {
slug = slug.trim();
}
// 2. 音译转换(处理特殊字符和中文)
if (options.transliterate) {
// 处理带重音的字符
slug = slug.replace(/[àáâãäå]/g, 'a')
.replace(/[èéêë]/g, 'e')
.replace(/[ìíîï]/g, 'i')
.replace(/[òóôõö]/g, 'o')
.replace(/[ùúûü]/g, 'u')
.replace(/[ñ]/g, 'n')
.replace(/[ç]/g, 'c');
// 处理中文(转拼音)
if (/[\u4e00-\u9fa5]/.test(slug)) {
slug = slug.replace(/[\u4e00-\u9fa5]+/g, (match) => {
return ' ' + pinyin(match, { toneType: 'none' }).join(' ') + ' ';
});
}
}
// 3. 移除数字(可选)
if (options.removeNumbers) {
slug = slug.replace(/[0-9]/g, '');
}
// 4. 移除特殊字符
slug = slug.replace(/[^\w\s-]/g, '');
// 5. 替换空白为分隔符
slug = slug.replace(/[\s_]+/g, options.separator);
// 6. 移除连续分隔符
slug = slug.replace(new RegExp(`${options.separator}+`, 'g'), options.separator);
// 7. 移除首尾分隔符
slug = slug.replace(new RegExp(`^${options.separator}|${options.separator}$`, 'g'), '');
// 8. 转小写
if (options.lowercase) {
slug = slug.toLowerCase();
}
// 9. 限制长度
if (options.maxLength > 0 && slug.length > options.maxLength) {
slug = slug.substring(0, options.maxLength);
// 在单词边界截断
const lastSep = slug.lastIndexOf(options.separator);
if (lastSep > options.maxLength * 0.5) {
slug = slug.substring(0, lastSep);
}
}
return slug;
}
Slug 最佳实践
| 实践 | 好的示例 | 不好的示例 |
|---|---|---|
| 使用短横线分隔 | my-blog-post |
my_blog_post |
| 保持简短 | seo-guide |
the-complete-guide-to-seo-optimization-2024 |
| 包含关键词 | react-hooks-tutorial |
post-12345 |
| 全部小写 | javascript-tips |
JavaScript-Tips |
| 避免停用词 | python-guide |
a-guide-to-python |
中文 Slug 处理
对于中文内容,有两种常见策略:
- 拼音转换:
你好世界→ni-hao-shi-jie - 保留中文:
你好世界→你好世界(需要 URL 编码)
推荐使用拼音转换,因为:
- 兼容性更好
- URL 更短
- 便于手动输入
重复行删除器:高效文本去重
应用场景
重复行删除器适用于多种场景:
- 清理邮件列表
- 去除重复的 URL
- 整理数据文件
- 合并配置项
去重算法
function removeDuplicates(text, options) {
let lines = text.split('\n');
// 去除空白
if (options.trimWhitespace) {
lines = lines.map(line => line.trim());
}
// 忽略空行
if (options.ignoreEmptyLines) {
lines = lines.filter(line => line.length > 0);
}
// 使用 Set 去重
const seen = new Set();
const uniqueLines = [];
for (const line of lines) {
// 根据选项决定比较键
const key = options.ignoreCase ? line.toLowerCase() : line;
if (!seen.has(key)) {
seen.add(key);
uniqueLines.push(line);
}
}
// 排序(可选)
if (options.sortOutput === 'asc') {
uniqueLines.sort((a, b) => a.localeCompare(b));
} else if (options.sortOutput === 'desc') {
uniqueLines.sort((a, b) => b.localeCompare(a));
}
return uniqueLines.join('\n');
}
查找重复项
除了删除重复,还可以找出哪些行是重复的:
function findDuplicates(text, options) {
let lines = text.split('\n');
if (options.trimWhitespace) {
lines = lines.map(line => line.trim());
}
if (options.ignoreEmptyLines) {
lines = lines.filter(line => line.length > 0);
}
// 统计每行出现次数
const count = {};
for (const line of lines) {
const key = options.ignoreCase ? line.toLowerCase() : line;
count[key] = (count[key] || 0) + 1;
}
// 筛选出现多次的行
const duplicates = Object.entries(count)
.filter(([_, c]) => c > 1)
.map(([line, c]) => `${line} (${c}x)`);
return duplicates.join('\n');
}
配置选项说明
| 选项 | 说明 | 示例 |
|---|---|---|
| 忽略大小写 | Apple 和 apple 视为相同 | 启用后只保留首次出现 |
| 去除空白 | 比较前移除首尾空格 | " hello " = "hello" |
| 忽略空行 | 不处理空白行 | 空行不计入统计 |
| 排序输出 | 按字母顺序排列结果 | A-Z 或 Z-A |
数字转文字:专业的数字表达
功能介绍
数字转文字工具将数字转换为英文单词表达,支持三种模式:
- 标准模式:
1234→one thousand two hundred thirty-four - 序数词模式:
1→first,2→second,3→third - 货币模式:
99.99→ninety-nine dollars and ninety-nine cents
转换算法
const ones = ['', 'one', 'two', 'three', 'four', 'five',
'six', 'seven', 'eight', 'nine'];
const teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
const tens = ['', '', 'twenty', 'thirty', 'forty',
'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
const scales = ['', 'thousand', 'million', 'billion', 'trillion'];
function numberToWords(num) {
if (num === 0) return 'zero';
const isNegative = num < 0;
num = Math.abs(num);
let words = [];
let scaleIndex = 0;
while (num > 0) {
const chunk = num % 1000;
if (chunk > 0) {
const chunkWords = convertChunk(chunk);
if (scales[scaleIndex]) {
words.unshift(chunkWords + ' ' + scales[scaleIndex]);
} else {
words.unshift(chunkWords);
}
}
num = Math.floor(num / 1000);
scaleIndex++;
}
return (isNegative ? 'minus ' : '') + words.join(' ');
}
function convertChunk(num) {
let words = [];
if (num >= 100) {
words.push(ones[Math.floor(num / 100)] + ' hundred');
num %= 100;
}
if (num >= 20) {
words.push(tens[Math.floor(num / 10)]);
num %= 10;
}
if (num >= 10) {
words.push(teens[num - 10]);
} else if (num > 0) {
words.push(ones[num]);
}
return words.join(' ');
}
货币转换
function numberToCurrency(num, currency = 'USD') {
const currencyConfig = {
USD: { main: 'dollar', sub: 'cent' },
EUR: { main: 'euro', sub: 'cent' },
GBP: { main: 'pound', sub: 'pence' },
CNY: { main: 'yuan', sub: 'fen' },
};
const config = currencyConfig[currency];
const dollars = Math.floor(num);
const cents = Math.round((num - dollars) * 100);
let result = '';
if (dollars > 0) {
result = numberToWords(dollars) + ' ' +
config.main + (dollars !== 1 ? 's' : '');
}
if (cents > 0) {
if (result) result += ' and ';
result += numberToWords(cents) + ' ' +
config.sub + (cents !== 1 ? 's' : '');
}
return result || 'zero ' + config.main + 's';
}
应用场景
- 支票填写:金额必须同时用数字和文字表示
- 法律文件:合同金额需要文字确认
- 教育用途:学习数字的英文表达
- 语音合成:将数字转换为可朗读的文本
常见问题解答
文本分析相关
Q: 阅读时间计算准确吗?
A: 阅读时间基于平均阅读速度计算(中文 300 字/分钟,英文 200 词/分钟)。实际阅读时间因人而异,此数值仅供参考。
Q: 词频分析支持中文吗?
A: 支持。中文采用二元组(两个连续汉字)和单字统计相结合的方式,能够较好地反映词汇使用频率。
命名转换相关
Q: camelCase 和 PascalCase 有什么区别?
A: camelCase 首字母小写(如 myVariable),PascalCase 首字母大写(如 MyClass)。前者常用于变量和函数,后者常用于类和组件。
Q: 什么时候使用 snake_case?
A: snake_case 主要用于 Python 变量和函数、数据库字段名、配置文件键名等场景。
Slug 生成相关
Q: Slug 中应该使用短横线还是下划线?
A: 推荐使用短横线(-)。Google 将短横线视为单词分隔符,而下划线会被视为单词的一部分。
Q: Slug 最佳长度是多少?
A: 建议控制在 50-60 个字符以内,包含 3-5 个关键词。过长的 Slug 会被搜索引擎截断。
Markdown 相关
Q: Markdown 编辑器支持哪些语法?
A: 支持所有标准 Markdown 语法,包括标题、列表、链接、图片、代码块、表格、引用等。
Q: 可以导出为其他格式吗?
A: 目前支持导出为 .md 文件和完整的 HTML 文档(包含样式)。
总结
文本处理是开发和内容创作的基础工作,选择合适的工具能够显著提升效率:
| 工具 | 核心功能 | 适用场景 |
|---|---|---|
| 文本分析器 | 统计、词频、阅读时间 | 内容创作、SEO 优化 |
| 大小写转换器 | 13 种命名风格转换 | 代码重构、格式统一 |
| Markdown 编辑器 | 实时预览、导出 | 文档编写、博客创作 |
| Slug 生成器 | SEO 友好 URL | 网站开发、内容发布 |
| 重复行删除器 | 去重、排序 | 数据清洗、列表整理 |
| 数字转文字 | 数字英文转换 | 支票、法律文件 |
所有工具都在浏览器本地运行,数据不会上传到服务器,确保您的内容安全和隐私。
相关资源
- 文本对比工具 - 比较两段文本的差异
- 正则表达式测试器 - 测试和调试正则表达式
- JSON 格式化工具 - 格式化和验证 JSON
- HTML 转 Markdown - 将 HTML 转换为 Markdown