Sensitive word detector
Scan text with your own word list, list every hit with its position and count, with `*` wildcards, a case switch, masking and a highlighted preview.
Runs in your browserEvery computation happens in your browser — your data never leaves this device.
What the f**k, this s**t is b*****d and b******d too.
What the fuck, this shit is badword and bad-word too.
fuck19shit120bad*word228, 40What this tool does
- Scan a post, product listing or marketing copy before publishing to catch words that a platform would flag as a violation.
- Run a custom word list for community moderation — ad terms, competitor names, slurs, one per line — and jump straight to each match position.
- Mask test data: turn nicknames or profanity into f**k style output so screenshots do not leak the original text.
- Debug "it looks the same but does not match" problems with the `*` wildcard, which catches variants such as fuck, fack and fck from f*ck.
Example
Input
Word list: fuck / shit / bad*word; text: What the fuck, this is shitty.
Output
Masked: What the f**k, this is s**tty.; 2 hits total (fuck at index 9, shit at index 23)
Matching is leftmost-longest and hits never overlap. Masking keeps the first and last character and replaces the rest with *, and words of two characters or fewer are masked completely.
Frequently asked questions
How does the `*` wildcard work?
`*` matches any characters (never across a line break) while everything else is treated literally. So f*ck hits fuck, fack and fck, and bad*word hits badxword. A pattern made only of `*` would match the empty string, so it is ignored.
Why was a word in my list not detected?
Three usual causes: "Case sensitive" is on while the text uses a different case; the occurrence was already consumed by an earlier, further-left hit (hits never overlap); or the line starts with `#` and was treated as a comment.
Can I publish the masked output directly?
Masking only replaces the matched characters and keeps the first and last letters, so the word stays recognisable. That is fine for screenshot redaction or examples, but it is not a compliant content filter — real filtering needs full replacement per platform rules.
What if the text or the word list is empty?
An empty text answers "Please enter text to scan" and an empty list (or one with only blank lines and `#` comments) answers "The word list cannot be empty". With only one side filled in you get no result rather than a misleading "no matches".
Is my text sent to a server?
No. Scanning, masking and highlighting all run as regular expressions in your browser. There are no network requests and neither your word list nor your text is stored.
Keywords:sensitive wordword filterprofanity敏感词过滤打码文本检测wildcardcontent filter