You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中统计纯文本单词数?Postgres 9.5去HTML标签统计方法

嘿,我来帮你搞定这两个PostgreSQL的问题!


1. 统计纯文本的单词数量

对于纯文本内容,我们可以借助正则表达式分割字符串,再过滤空元素来统计单词数。这里有两种简洁的实现方式:

第一种是用regexp_split_to_array配合COUNT:

SELECT 
  COUNT(*) AS word_count
FROM 
  regexp_split_to_array('Lorem Ipsum dolor sit amet', '\W+') AS words
WHERE 
  words <> '';

第二种更紧凑,用array_length和array_remove组合:

SELECT 
  array_length(array_remove(regexp_split_to_array('Lorem Ipsum dolor sit amet', '\W+'), ''), 1) AS word_count;

这里的\W+表示匹配一个或多个非单词字符(比如空格、标点),用来分割单词;array_remove是为了删掉分割后产生的空字符串(比如文本首尾的空格导致的空元素)。


2. 去除HTML标签后统计纯文本的指标

PostgreSQL 9.5没有内置的HTML解析工具,不过我们可以用正则表达式写一个自定义函数来去除标签、属性和HTML实体,之后再统计单词数和长度。

第一步:创建去除HTML的函数

先定义一个strip_html_tags函数,处理HTML内容:

CREATE OR REPLACE FUNCTION strip_html_tags(html text) RETURNS text AS $$
BEGIN
  -- 移除所有HTML标签(包括标签内的属性)
  html := regexp_replace(html, '<[^>]+>', '', 'g');
  -- 替换常见的HTML实体为对应字符
  html := regexp_replace(html, '&lt;', '<', 'g');
  html := regexp_replace(html, '&gt;', '>', 'g');
  html := regexp_replace(html, '&amp;', '&', 'g');
  html := regexp_replace(html, '&nbsp;', ' ', 'g');
  -- 把连续的空白字符替换成单个空格
  html := regexp_replace(html, '\s+', ' ', 'g');
  -- 去除首尾的空白
  html := trim(html);
  RETURN html;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

第二步:使用函数统计指标

假设你的表名为your_table,存储HTML的字段是html_content,可以这样查询:

SELECT 
  html_content,
  strip_html_tags(html_content) AS plain_text,
  length(strip_html_tags(html_content)) AS text_length,
  -- 处理空文本的情况,避免报错
  CASE 
    WHEN strip_html_tags(html_content) = '' THEN 0
    ELSE array_length(array_remove(regexp_split_to_array(strip_html_tags(html_content), '\W+'), ''), 1)
  END AS word_count
FROM 
  your_table;

注意事项

用正则处理HTML不是100%完美的,比如遇到嵌套异常的标签、注释或者特殊的脚本标签时可能处理不彻底,但对于大多数常规的HTML内容(像你给出的示例文本),这个函数已经足够好用了。


内容的提问来源于stack exchange,提问作者wbn205

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:02:52