PHPackages                             cavalheri/laravel-fuzzy-validation - 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. [Validation &amp; Sanitization](/categories/validation)
4. /
5. cavalheri/laravel-fuzzy-validation

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

cavalheri/laravel-fuzzy-validation
==================================

Fuzzy validation rules for Laravel with approximate string matching support.

v1.0.1(2w ago)21↓100%MITPHPPHP ^8.3CI passing

Since May 25Pushed 2w agoCompare

[ Source](https://github.com/LucasCavalheri/laravel-fuzzy-validation)[ Packagist](https://packagist.org/packages/cavalheri/laravel-fuzzy-validation)[ RSS](/packages/cavalheri-laravel-fuzzy-validation/feed)WikiDiscussions master Synced 1w ago

READMEChangelogDependencies (7)Versions (4)Used By (0)

Laravel Fuzzy Validation
========================

[](#laravel-fuzzy-validation)

[![Tests](https://github.com/cavalheri/laravel-fuzzy-validation/actions/workflows/tests.yml/badge.svg)](https://github.com/cavalheri/laravel-fuzzy-validation/actions/workflows/tests.yml)[![Latest Version on Packagist](https://camo.githubusercontent.com/cbc06fe52a13e8f34813adebb9cd7f3971cc558765dfa524efc74c8731c9706b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f636176616c686572692f6c61726176656c2d66757a7a792d76616c69646174696f6e2e737667)](https://packagist.org/packages/cavalheri/laravel-fuzzy-validation)[![License](https://camo.githubusercontent.com/745e834fcc2e6f96ef4ff52ed2436da79d684d5d15bb1549c630c29651a1d48e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f636176616c686572692f6c61726176656c2d66757a7a792d76616c69646174696f6e2e737667)](https://packagist.org/packages/cavalheri/laravel-fuzzy-validation)

Fuzzy validation rules for Laravel with approximate string matching support. Prevent near-duplicate entries such as `The Matrix` vs `Th3 M4tr1x` or `Café` vs `Cafe`.

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

[](#requirements)

- PHP 8.3+
- Laravel 13+

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

[](#installation)

```
composer require cavalheri/laravel-fuzzy-validation
```

The package supports [auto-discovery](https://laravel.com/docs/packages#package-discovery). Publish the configuration file when needed:

```
php artisan vendor:publish --tag=fuzzy-validation-config
```

Quick Start
-----------

[](#quick-start)

### Fluent Rule API

[](#fluent-rule-api)

```
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$validator = Validator::make($request->all(), [
    'title' => [
        'required',
        Rule::fuzzyUnique('movies', 'title')
            ->threshold(85)
            ->ignore($movie?->id)
            ->normalize(),
    ],
]);
```

### String Syntax

[](#string-syntax)

```
'title' => 'required|fuzzy_unique:movies,title'
```

You can pass additional parameters:

```
'title' => 'required|fuzzy_unique:movies,title,90,normalize,driver=jaro_winkler,ignore=1'
```

Configuration
-------------

[](#configuration)

```
// config/fuzzy-validation.php

return [
    'driver' => env('FUZZY_VALIDATION_DRIVER', 'similar_text'),
    'threshold' => (int) env('FUZZY_VALIDATION_THRESHOLD', 85),

    'normalization' => [
        'lowercase' => true,
        'trim' => true,
        'collapse_spaces' => true,
        'remove_accents' => true,
        'leetspeak' => false,
    ],

    'messages' => [
        'fuzzy_unique' => 'The :attribute is too similar to an existing value.',
    ],
];
```

Features
--------

[](#features)

### Similarity Drivers

[](#similarity-drivers)

DriverDescription`similar_text`PHP native `similar_text()` (default)`levenshtein`Levenshtein distance converted to percentage`jaro_winkler`Jaro-Winkler algorithm implementationSelect a driver globally or per rule:

```
Rule::fuzzyUnique('movies', 'title')->driver('jaro_winkler')
```

### Normalization Pipeline

[](#normalization-pipeline)

Enable normalization on a rule:

```
Rule::fuzzyUnique('movies', 'title')->normalize()
```

Available normalizers:

- lowercase
- trim
- collapse spaces
- remove accents
- optional leetspeak (`4` → `a`, `3` → `e`, `1` → `i`, `0` → `o`, `5` → `s`, `7` → `t`)

Enable leetspeak normalization:

```
Rule::fuzzyUnique('movies', 'title')->normalize()->leetspeak()
```

Override defaults per rule:

```
Rule::fuzzyUnique('movies', 'title')->normalize([
    'remove_accents' => false,
    'leetspeak' => true,
])
```

### Threshold

[](#threshold)

Similarity is measured from `0` to `100`. Higher values require closer matches.

```
Rule::fuzzyUnique('movies', 'title')->threshold(90)
```

### Ignore Records

[](#ignore-records)

Works like Laravel's built-in `unique` rule:

```
Rule::fuzzyUnique('movies', 'title')->ignore($movie->id)
Rule::fuzzyUnique('movies', 'title')->ignore($movie)
Rule::fuzzyUnique('movies', 'title')->ignore($uuid, 'uuid')
```

### Additional Constraints

[](#additional-constraints)

```
Rule::fuzzyUnique('movies', 'title')->where('published', true)

Rule::fuzzyUnique('movies', 'title')->where(function ($query) {
    $query->where('tenant_id', tenant('id'));
})
```

### Custom Similarity Drivers

[](#custom-similarity-drivers)

Implement the `SimilarityDriver` contract:

```
use Cavalheri\LaravelFuzzyValidation\Contracts\SimilarityDriver;

final class MyDriver implements SimilarityDriver
{
    public function compare(string $first, string $second): float
    {
        // Return similarity percentage (0-100)
    }
}
```

Register the driver:

```
use Cavalheri\LaravelFuzzyValidation\Similarity\SimilarityManager;

app(SimilarityManager::class)->extend('my_driver', MyDriver::class);
```

Use it in validation:

```
Rule::fuzzyUnique('movies', 'title')->driver('my_driver')
```

Database Support
----------------

[](#database-support)

The package works with any database supported by Laravel's query builder:

- MySQL
- PostgreSQL
- SQLite

Validation Message
------------------

[](#validation-message)

Default message:

```
The :attribute is too similar to an existing value.

```

Customize via config or language files:

```
'fuzzy-validation.messages.fuzzy_unique' => 'This title is too close to an existing movie.',
```

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md).

License
-------

[](#license)

The MIT License (MIT). See [LICENSE](LICENSE) for details.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance97

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

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

Every ~0 days

Total

2

Last Release

15d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/dc9512de33226eedbf2597a3136c41dad3f0ddac10bb6b10d0a917f0876b257f?d=identicon)[LucasCavalheri](/maintainers/LucasCavalheri)

---

Top Contributors

[![LucasCavalheri](https://avatars.githubusercontent.com/u/104279631?v=4)](https://github.com/LucasCavalheri "LucasCavalheri (3 commits)")

---

Tags

laravelvalidationuniquesimilarityjaro winklerlevenshteinfuzzy

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/cavalheri-laravel-fuzzy-validation/health.svg)

```
[![Health](https://phpackages.com/badges/cavalheri-laravel-fuzzy-validation/health.svg)](https://phpackages.com/packages/cavalheri-laravel-fuzzy-validation)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3325.1M337](/packages/psalm-plugin-laravel)[watson/validating

Eloquent model validating trait.

9743.4M53](/packages/watson-validating)[wendelladriel/laravel-validated-dto

Data Transfer Objects with validation for Laravel applications

762621.7k17](/packages/wendelladriel-laravel-validated-dto)[laravel/ai

The official AI SDK for Laravel.

9782.1M153](/packages/laravel-ai)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

76318.2M110](/packages/laravel-mcp)[spatie/laravel-health

Monitor the health of a Laravel application

88011.3M149](/packages/spatie-laravel-health)

PHPackages © 2026

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