PHPackages                             henrik9999/string-similarity - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. henrik9999/string-similarity

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

henrik9999/string-similarity
============================

Finds degree of similarity between two strings, based on Dice's Coefficient, which is mostly better than Levenshtein distance.

1.0.1(3y ago)114.0k↓33.3%2MITPHPPHP ^7.4|^8.0

Since Jun 19Pushed 2y ago1 watchersCompare

[ Source](https://github.com/henrik9999/string-similarity)[ Packagist](https://packagist.org/packages/henrik9999/string-similarity)[ RSS](/packages/henrik9999-string-similarity/feed)WikiDiscussions main Synced 1mo ago

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

string-similarity
=================

[](#string-similarity)

Finds degree of similarity between two strings, based on [Dice's Coefficient](http://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient), which is mostly better than [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance).

This implementation actually treats multiple occurrences of a bigram as unique. The correctness of this behavior is most easily seen when getting the similarity between "GG" and "GGGGGGGG", which should obviously not be 1.

This is a PHP implemenation of the Node.js package [string-similarity](https://github.com/aceakash/string-similarity)

Usage
-----

[](#usage)

Install using:

```
composer require henrik9999/string-similarity
```

In your code:

```
$stringSimilarity = new StringSimilarity();

$similarity = $stringSimilarity->compareTwoStrings("healed", "sealed");

$matches = $stringSimilarity->findBestMatch("healed", [
  "edward",
  "sealed",
  "theatre",
]);
```

API
---

[](#api)

The package contains two methods:

### compareTwoStrings(string $string1, string $string2, bool $casesensitive)

[](#comparetwostringsstring-string1-string-string2-bool-casesensitive)

Returns a fraction between 0 and 1, which indicates the degree of similarity between the two strings. 0 indicates completely different strings, 1 indicates identical strings. The comparison is case-sensitive by default.

##### Arguments

[](#arguments)

1. string1 (string): The first string
2. string2 (string): The second string
3. casesensitive (bool): If the comparison should be case-sensitive

Order does not make a difference.

##### Returns

[](#returns)

(number): A fraction from 0 to 1, both inclusive. Higher number indicates more similarity.

##### Examples

[](#examples)

```
$stringSimilarity->compareTwoStrings("healed", "sealed");
// → 0.8

$stringSimilarity->compareTwoStrings(
  "Olive-green table for sale, in extremely good condition.",
  "For sale: table in very good  condition, olive green in colour."
);
// → 0.6060606060606061

$stringSimilarity->compareTwoStrings(
  "Olive-green table for sale, in extremely good condition.",
  "For sale: green Subaru Impreza, 210,000 miles"
);
// → 0.2558139534883721

$stringSimilarity->compareTwoStrings(
  "Olive-green table for sale, in extremely good condition.",
  "Wanted: mountain bike with at least 21 gears."
);
// → 0.1411764705882353
```

### findBestMatch(string mainString, array targetStrings, bool $casesensitive)

[](#findbestmatchstring-mainstring-array-targetstrings-bool-casesensitive)

Compares `mainString` against each string in `targetStrings`.

##### Arguments

[](#arguments-1)

1. mainString (string): The string to match each target string against.
2. targetStrings (array): Each string in this array will be matched against the main string.
3. casesensitive (bool): If the comparison should be case-sensitive.

##### Returns

[](#returns-1)

(Object): An object with a `ratings` property, which gives a similarity rating for each target string, a `bestMatch` property, which specifies which target string was most similar to the main string, and a `bestMatchIndex` property, which specifies the index of the bestMatch in the targetStrings array.

##### Examples

[](#examples-1)

```
$stringSimilarity->findBestMatch('Olive-green table for sale, in extremely good condition.', [
  'For sale: green Subaru Impreza, 210,000 miles',
  'For sale: table in very good condition, olive green in colour.',
  'Wanted: mountain bike with at least 21 gears.'
]);
// →
array(3) {
  ["ratings"]=>
  array(3) {
    [0]=>
    array(2) {
      ["target"]=>
      string(45) "For sale: green Subaru Impreza, 210,000 miles"
      ["rating"]=>
      float(0.2558139534883721)
    }
    [1]=>
    array(2) {
      ["target"]=>
      string(62) "For sale: table in very good condition, olive green in colour."
      ["rating"]=>
      float(0.6060606060606061)
    }
    [2]=>
    array(2) {
      ["target"]=>
      string(45) "Wanted: mountain bike with at least 21 gears."
      ["rating"]=>
      float(0.1411764705882353)
    }
  }
  ["bestMatch"]=>
  array(2) {
    ["target"]=>
    string(62) "For sale: table in very good condition, olive green in colour."
    ["rating"]=>
    float(0.6060606060606061)
  }
  ["bestMatchIndex"]=>
  int(1)
}
```

Release Notes
-------------

[](#release-notes)

### 1.0.1

[](#101)

- Made some perfomance improvements

### 1.0.0

[](#100)

- Initial Release

###  Health Score

31

—

LowBetter than 68% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity29

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity54

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 ~2 days

Total

2

Last Release

1427d ago

PHP version history (2 changes)1.0.0PHP ^8.0

1.0.1PHP ^7.4|^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/94912ec264627da40cc4863b861553638c5151107a4f4e63d3741a2abfbb4537?d=identicon)[henrik9999](/maintainers/henrik9999)

---

Top Contributors

[![henrik9999](https://avatars.githubusercontent.com/u/22085664?v=4)](https://github.com/henrik9999 "henrik9999 (7 commits)")

---

Tags

dice-coefficientphpphp8stringstring-comparisonstring-distancestring-distance-calculationstring-similaritystringsstringsstring-similaritydice-coefficientstring-comparison

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/henrik9999-string-similarity/health.svg)

```
[![Health](https://phpackages.com/badges/henrik9999-string-similarity/health.svg)](https://phpackages.com/packages/henrik9999-string-similarity)
```

###  Alternatives

[doctrine/inflector

PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.

11.4k855.8M711](/packages/doctrine-inflector)[snipe/banbuilder

Library to easily handle profanity filtering in PHP projects.

3371.5M3](/packages/snipe-banbuilder)[tamtamchik/namecase

This package allows you to convert names into the correct case where possible.

78506.0k](/packages/tamtamchik-namecase)[delight-im/str

Convenient object-oriented operations on strings

68336.2k2](/packages/delight-im-str)[delight-im/random

The most convenient way to securely generate anything random in PHP

2345.4k](/packages/delight-im-random)[colinodell/indentation

Library to detect and manipulate indentation in strings and files

3911.5k5](/packages/colinodell-indentation)

PHPackages © 2026

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