Paragraph Counter
Paste or type your text below, paragraph count updates instantly, with a per-paragraph breakdown of word and character counts.
About the Paragraph Counter
Paragraphs are detected wherever there's a blank line separating blocks of text, then each one gets its own row in the table below showing its word and character count. It's a quick way to check pacing, spot an unusually long paragraph, or confirm a piece is broken into readable chunks.
- Paragraphs, split on one or more blank lines between blocks of text.
- Per-paragraph stats, word count and character count for each detected paragraph.
A paragraph break needs a genuine blank line, not just a line wrap
The split pattern is /\n\s*\n/, which requires two newline characters with only whitespace allowed between them — in plain terms, an actual empty line separating two blocks of text. A single line break on its own, the kind that happens when a word processor or a plain-text source wraps a paragraph onto a new line without inserting a blank line after it, does not count as a paragraph boundary here. If your source text uses one line break per paragraph rather than a blank line between them (common when pasting from certain CMS exports or plain single-spaced documents), this tool will read the whole thing as one long paragraph rather than several short ones — worth checking for if the paragraph count looks lower than you expected.
Multiple blank lines in a row still count as a single break
Because the middle of the split pattern, \s*, matches any amount of whitespace including several stacked blank lines, three or four empty lines between two blocks of text are treated exactly the same as one — they collapse into a single paragraph boundary rather than generating extra, empty paragraph entries in the table. Leading and trailing blank lines at the very start or end of your pasted text are handled the same way: each resulting chunk is trimmed and anything that trims down to nothing is filtered out before the count runs, so accidental blank space around your text never inflates the paragraph count.
The results table is built from real DOM elements, not an HTML string
Rather than assembling the table as a template-literal string and injecting it with innerHTML, the table, its rows, and its cells are all created with document.createElement() and populated using .textContent. That's a meaningfully safer approach when the content going into those cells is whatever you paste: text assigned through .textContent is always treated as plain text, never parsed as markup, so pasting something that looks like an HTML tag as part of your paragraph can't affect the table's structure or execute anything, the way concatenating raw text into an HTML string and injecting it could.
Per-paragraph counts use the same methods as this site's other counters
Each row's word count comes from splitting the paragraph's trimmed text on runs of whitespace, the same approach used by the Word Counter tool, so a paragraph's word count here will match what you'd get pasting just that paragraph into the standalone tool. The character count is the paragraph's plain string length after trimming, meaning leading or trailing spaces around a paragraph (which get stripped before it's even recognized as a paragraph) never factor into the count you see.
What an uneven paragraph breakdown is actually useful for
The per-paragraph table exists because a single overall word count hides pacing problems that only show up when you look at individual chunks. A 1,200-word article with a total word count that looks perfectly reasonable can still have one 400-word paragraph sitting in the middle of a string of 60-word ones, which is exactly the kind of density spike that makes a reader's eyes glaze over on a screen, especially on mobile where a dense paragraph fills the entire viewport with no visual break. Editors, bloggers, and anyone writing for the web tend to use a rough per-paragraph target (often cited as somewhere in the 40-to-100-word range for online reading, well below what's typical in print) precisely because scanning a wall of unbroken text is measurably harder on a screen than on a printed page — seeing each paragraph's length side by side in a table makes an outlier immediately obvious in a way that scrolling through the raw text usually doesn't.
Frequently Asked Questions
Why does my text show up as one giant paragraph instead of several?
Paragraph breaks are only recognized where there's a genuine blank line — two newline characters with only whitespace between them. If your source text separates paragraphs with a single line break and no blank line, the whole block will be read as one paragraph until you add blank lines between them.
Do several blank lines in a row create extra empty paragraphs?
No. Any run of blank lines, however many, is treated as a single paragraph boundary, and any resulting chunk that trims down to nothing is filtered out entirely, so stacked blank lines never appear as empty rows in the results table.
Is it safe to paste text containing HTML tags or angle brackets?
Yes. The results table is built using real DOM elements with their content set via .textContent rather than by injecting an HTML string, so anything you paste is always treated as plain text in the table, never parsed as markup.
Will the word count for a paragraph match the Word Counter tool?
Yes. Both use the same method: trimming the text and splitting it on runs of whitespace, so a paragraph's word count here matches what you'd get pasting just that paragraph into the standalone Word Counter tool.
Is my text sent anywhere when I use this tool?
No. All splitting and counting happens locally in your browser as you type; nothing is uploaded to a server.