Count words, characters, sentences and paragraphs as you type, with a reading-time estimate and a list of the words you have repeated most. The panel header shows how many characters are left before the next common limit: 60 for a title tag, 155 for a meta description and 280 for a post on X.
About 155 characters on desktop and closer to 120 on mobile. Google truncates by pixel width, so a line full of capitals gets cut earlier.
Roughly 60 characters. Put the main keyword and topic in the first 40, because the end is the part that gets cut.
280 characters, and every link counts as 23 whatever its real length. This counter counts a link at its full length, so expect X to report fewer.
Facebook shows about 300 characters and LinkedIn cuts off much earlier. Write the first sentence so it makes sense on its own.
Words are runs of non-whitespace characters. A hyphenated compound such as client-side counts as one word, and so does a dash or an emoji standing alone between spaces. Word processors that skip punctuation-only tokens can report a slightly lower number.
Characters are
counted by Unicode code point. A flag emoji is built from two
code points and counts as two. Python's len() gives
the same number, while JavaScript's .length counts
UTF-16 units and reports 4 for the same flag.
Sentences end at a period, question mark or exclamation mark followed by whitespace or the end of the text. Abbreviations such as e.g. and Dr. inflate the count a little, so treat it as an estimate.
Reading time is words divided by 200 and rounded up, so 950 words shows as 5 min. Dense technical prose reads slower than 200 words per minute and a light list post reads faster.
const text = "The quick brown fox. It jumped over the lazy dog!";
const words = text.trim() ? text.trim().split(/\s+/).length : 0;
const chars = [...text].length; // by code point, not UTF-16 unit
const charsNoSpace = [...text.replace(/\s/g, "")].length;
const sentences = (text.match(/[^.!?]+[.!?]+(\s|$)/g) || []).length;
console.log({ words, chars, charsNoSpace, sentences });
// "abc".length is 3, but "👍".length is 2 and [..."👍"].length is 1.
// Use the spread form whenever an emoji might show up. To count the way a reader sees it, use Intl.Segmenter with granularity 'grapheme'. A flag or a skin-toned emoji is several code points but one visible character.
<?php
$text = "The quick brown fox. It jumped over the lazy dog!";
echo str_word_count($text), PHP_EOL; // ASCII only
echo count(preg_split('/\s+/u', trim($text))), PHP_EOL; // Unicode safe
echo mb_strlen($text, 'UTF-8'), PHP_EOL; // characters
echo strlen($text), PHP_EOL; // bytes, not the same thing
// Word frequency, ignoring case
$counts = array_count_values(
array_map('mb_strtolower', preg_split('/\W+/u', $text, -1, PREG_SPLIT_NO_EMPTY))
);
arsort($counts);
print_r(array_slice($counts, 0, 5, true)); strlen() counts bytes. On a UTF-8 string with any accent in it, that number is larger than the character count. For example, strlen('café') is 5 while mb_strlen('café') is 4.
from collections import Counter
import re
text = "The quick brown fox. It jumped over the lazy dog!"
words = text.split()
print(len(words)) # words
print(len(text)) # characters (Python 3 counts code points)
print(len(text.replace(" ", "")))
sentences = [s for s in re.split(r"[.!?]+", text) if s.strip()]
print(len(sentences))
common = Counter(w.lower().strip(".,!?") for w in words)
print(common.most_common(5))
# Reading time, at 200 words per minute
print(-(-len(words) // 200), "min") Search results truncate by pixel width. Google cuts a title at around 600 pixels, which is roughly 60 characters of lowercase text but noticeably fewer if the title is full of capitals or wide letters. Treat 60 and 155 as guides, then check the result in a SERP preview before publishing.
This tool follows the specifications below. Read them when you need the exact normative wording, for example to settle an edge case between two implementations.
Both numbers are shown. Use the count with spaces for X posts, meta descriptions and most form limits. The count without spaces is what some translation and copywriting agencies bill on.
Words divided by 200, rounded up, so 950 words shows as 5 min. 200 words per minute is a common estimate for adult reading speed on general prose. Dense documentation reads slower and a light list post reads faster.
On a period, question mark or exclamation mark followed by whitespace or the end of the text. Abbreviations such as e.g. and Dr. inflate the count slightly, so treat it as an estimate.
Yes, under the counters. It lists up to 8 repeated words with each one's share of the total, which makes a word you have used 11 times on one page easy to spot. Common words such as the and with, and words under 3 letters, are left out.
No. The character count is by Unicode code point, so a flag or a skin-toned emoji made of two code points counts as 2. Python's len() gives the same number. JavaScript's .length counts UTF-16 units and reports 4 for a flag, so check which method your length limit uses.
If you write in Markdown, the Markdown editor previews as you type. To compare two drafts, the diff checker shows what changed, and the slug generator turns the finished headline into a URL.