PHPackages                             szymanski-luk/polish-profanity-filter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. szymanski-luk/polish-profanity-filter

ActiveLibrary[Search &amp; Filtering](/categories/search)

szymanski-luk/polish-profanity-filter
=====================================

Polish profanity filter with support for inflections, masking and detection

1.0.0(3mo ago)12MITPHP ^8.1

Since Apr 18Compare

[ Source](https://github.com/szymanski-luk/polish-profanity-filter)[ Packagist](https://packagist.org/packages/szymanski-luk/polish-profanity-filter)[ RSS](/packages/szymanski-luk-polish-profanity-filter/feed)WikiDiscussions Synced 3w ago

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

Polish Profanity Filter 🇵🇱
==========================

[](#polish-profanity-filter-)

Lightweight PHP library for detecting and masking Polish profanity in text.

Supports:

- case-insensitive detection
- Unicode-safe matching
- configurable masking strategies
- custom dictionary providers
- custom search patterns
- match position detection (start/end offsets)

Designed for moderation systems, comments filtering, validation pipelines, and content sanitization.

---

Requirements
------------

[](#requirements)

- PHP 8.1
- ext-mbstring

Installation
------------

[](#installation)

```
composer require szymanski-luk/polish-profanity-filter
```

Basic usage
-----------

[](#basic-usage)

### Checking if text contains profanity

[](#checking-if-text-contains-profanity)

```
use PolishProfanityFilter\PolishProfanityFilter;

$filter = new PolishProfanityFilter();

$filter->containsProfanity('To jest kurwa test.'); // true
```

### Finding matches with offsets

[](#finding-matches-with-offsets)

```
$matches = $filter->findProfanities('To jest kurwa test.'); // MatchCollection object

foreach ($matches as $match) {
    echo $match->word;
    echo $match->start;
    echo $match->end;
}
```

Example result:

```
word: 'kurwa'
start: 8
end: 13
```

`findProfanities()` returns a `MatchCollection` object. Available methods:

- `isEmpty(): bool`
- `all(): array`
- `first(): ?MatchResult`
- `last(): ?MatchResult`
- `count(): int`
- `containsWord(string $word, bool $caseInsensitive = true): bool`

### Masking profanity

[](#masking-profanity)

```
$filter->maskProfanities('To jest kurwa test.'); // To jest k***a test.
```

Extending
---------

[](#extending)

This package can be extended with custom maskers, additional dictionary providers, and custom search patterns.

### Custom Masker

[](#custom-masker)

To create a custom Masker, create a class that implements the `MaskerInterface`.

Example:

```
class CustomMasker implements MaskerInterface
{
    public function mask(string $word): string
    {
        $length = mb_strlen($word);

        return str_repeat('*', $length)
    }
}
```

Now you should instantiate `PolishProfanityFilter` as follows:

```
$filter = new PolishProfanityFilter(masker: new CustomMasker());
```

### Additional Dictionary

[](#additional-dictionary)

To create an additional Dictionary, create a class that implements the `DictionaryProviderInterface`.

```
class AdditionalDictionaryProvider implements DictionaryProviderInterface
{
    public function getDictionary(): array
    {
        return ['word1', 'word2'];
    }
}
```

Now you should instantiate `PolishProfanityFilter` as follows:

```
$filter = new PolishProfanityFilter(additionalDictionaryProviders: [new AdditionalDictionaryProvider()]);
```

...or you can override default Dictionary:

```
$filter = new PolishProfanityFilter(defaultDictionaryProvider: new AdditionalDictionaryProvider());
```

### Custom SearchPattern

[](#custom-searchpattern)

To create a custom SearchPattern, create a class that implements the `SearchPatternInterface`.

```
class CustomSearchPattern implements SearchPatternInterface
{
    public function buildPattern(string $word): string
    {
        return '/(?' . preg_quote($word, '/') . '(?![\p{L}\p{N}_])/iu';
    }
}
```

Now you should instantiate `PolishProfanityFilter` as follows:

```
$filter = new PolishProfanityFilter(searchPattern: new CustomSearchPattern());
```

Advanced Usage
--------------

[](#advanced-usage)

If you use Symfony and want to register `PolishProfanityFilter` as a service, you can do it like this:

```
# services.yaml

PolishProfanityFilter\PolishProfanityFilter: ~
```

or (in case you want to extend filter)

```
# services.yaml

App\Custom\CustomDictionaryProvider: ~

PolishProfanityFilter\PolishProfanityFilter:
    arguments:
        $additionalDictionaryProviders: ['@App\Custom\CustomDictionaryProvider']
```

Contributing
------------

[](#contributing)

Contributions are welcome.

You can help by:

- improving the default dictionary
- improving search patterns
- fixing bugs
- adding tests and documentation

Please open an issue or submit a pull request.

Development
-----------

[](#development)

Run tests:

```
composer test
```

Run static analysis:

```
composer stan
```

Run code style:

```
composer cs-check
```

Fix code style:

```
composer cs-fix
```

License
-------

[](#license)

MIT

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance82

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

97d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/69248757?v=4)[Łukasz Szymański](/maintainers/szymanski-luk)[@szymanski-luk](https://github.com/szymanski-luk)

---

Tags

filterprofanitynlpmoderationpolishbad wordsprzekleństwa

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/szymanski-luk-polish-profanity-filter/health.svg)

```
[![Health](https://phpackages.com/badges/szymanski-luk-polish-profanity-filter/health.svg)](https://phpackages.com/packages/szymanski-luk-polish-profanity-filter)
```

###  Alternatives

[clue/stream-filter

A simple and modern approach to stream filtering in PHP

1.7k276.5M9](/packages/clue-stream-filter)[laminas/laminas-filter

Programmatically filter and normalize data and files

9530.3M183](/packages/laminas-laminas-filter)[diego-ninja/sentinel

A content moderation and sentiment analysis library for Laravel 10+

394.8k](/packages/diego-ninja-sentinel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
