Waka blog.

[Go]文字列の中からhtmlタグを除く文字数をカウントする

リッチテキストエディタ等で入力されたHTMLで装飾された文字列の中から、実際にユーザーが入力した文字数だけをカウントしたい。

golangを使用する場合以下の手順で実装する。

  1. 文字列をhtmlにパース
  2. html.TextNodeのデータを抽出し、変数に加算
    1. HTMLエンティティはhtml.UnescapeStringでデコード
  3. 子ノードがある場合は再起的に取得
  4. 加算した変数をruneの配列に変換し、lenで長さを取得する

実際のコードは以下

func extractTextCountFromHTML(content string) (int, error) {
	doc, err := html.Parse(strings.NewReader(v.String()))
	if err != nil {
		return 0, err
	}

	var text int
	var extractText func(*html.Node)
	extractText = func(n *html.Node) {
		if n.Type == html.TextNode {
      // escape html entity
			text += html.UnescapeString(n.Data)
		}

		for c := n.FirstChild; c != nil; c = c.NextSibling {
			extractText(c)
		}
	}
	extractText(doc)

  return len([]rune(text)), nil
}