PHPackages                             baraja-core/simple-php-diff - 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. baraja-core/simple-php-diff

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

baraja-core/simple-php-diff
===========================

Find the quick difference between two text files in PHP.

v1.0.4(4mo ago)1142.9k↓70.2%2[2 issues](https://github.com/baraja-core/simple-php-diff/issues)1PHPPHP ^8.0CI failing

Since Mar 29Pushed 4mo ago1 watchersCompare

[ Source](https://github.com/baraja-core/simple-php-diff)[ Packagist](https://packagist.org/packages/baraja-core/simple-php-diff)[ Docs](https://github.com/baraja-core/simple-php-diff)[ RSS](/packages/baraja-core-simple-php-diff/feed)WikiDiscussions master Synced 1w ago

READMEChangelog (5)Dependencies (7)Versions (8)Used By (1)

Simple PHP Diff
===============

[](#simple-php-diff)

A lightweight PHP library for fast text comparison and difference visualization. Find the quick difference between two text files and render the results in plain text or HTML format.

Key Principles
--------------

[](#key-principles)

- **Line-by-line comparison** - Compares texts line by line with numbered output for easy change tracking
- **Immutable result object** - Returns a `Diff` object containing original, target, formatted diff, and changed line numbers
- **Dual output modes** - Plain text diff output and styled HTML rendering with color-coded changes
- **Strict mode support** - Optional strict comparison that preserves different line ending formats
- **Whitespace visualization** - Pretty rendering shows tabs as arrows and spaces as dots for clarity
- **Zero dependencies** - Pure PHP implementation requiring only PHP 8.0+

Architecture
------------

[](#architecture)

The library consists of two main components with a clean separation of concerns:

```
┌─────────────────────────────────────────────────────────────┐
│                        SimpleDiff                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  compare($left, $right, $strict)                    │   │
│  │  - Normalizes line endings (non-strict mode)        │   │
│  │  - Performs line-by-line comparison                 │   │
│  │  - Tracks changed line numbers                      │   │
│  │  - Formats output with line numbers                 │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  renderDiff($diff)                                  │   │
│  │  - Converts diff to styled HTML                     │   │
│  │  - Color-codes additions (green) / removals (red)   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│                          Diff                               │
│  Immutable Value Object                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  - original: string     (normalized left input)     │   │
│  │  - target: string       (normalized right input)    │   │
│  │  - diff: string         (formatted diff output)     │   │
│  │  - changedLines: int[]  (line numbers that changed) │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

```

Components
----------

[](#components)

### SimpleDiff

[](#simplediff)

The main comparison engine that processes two text inputs and generates a diff result.

**Methods:**

MethodDescription`compare(string $left, string $right, bool $strict = false): Diff`Compares two strings and returns a `Diff` object`renderDiff(Diff|string $diff): string`Renders the diff as styled HTML**Comparison Process:**

1. **Input normalization** (non-strict mode): Converts all line endings (`\r\n`, `\r`) to `\n` and trims whitespace
2. **Line splitting**: Splits both inputs into arrays by newline character
3. **Line-by-line comparison**: Iterates through lines, comparing original vs target
4. **Output formatting**: Prepends each line with status marker (`+`, `-`, or space) and line number
5. **Change tracking**: Records line numbers where differences occur

### Diff

[](#diff)

An immutable value object that encapsulates the comparison result.

**Properties (via getters):**

PropertyTypeDescription`original``string`The normalized left/original input text`target``string`The normalized right/target input text`diff``string`The formatted diff output with line markers`changedLines``int[]`Array of line numbers (1-indexed) that differ**String Conversion:**

The `Diff` object implements `__toString()` which returns the formatted diff string, allowing direct string casting.

📦 Installation
--------------

[](#-installation)

It's best to use [Composer](https://getcomposer.org) for installation, and you can also find the package on [Packagist](https://packagist.org/packages/baraja-core/simple-php-diff) and [GitHub](https://github.com/baraja-core/simple-php-diff).

To install, simply use the command:

```
$ composer require baraja-core/simple-php-diff
```

You can use the package manually by creating an instance of the internal classes, or register a DIC extension to link the services directly to the Nette Framework.

### Requirements

[](#requirements)

- PHP 8.0 or higher

Basic Usage
-----------

[](#basic-usage)

### Simple Text Comparison

[](#simple-text-comparison)

```
use Baraja\DiffGenerator\SimpleDiff;

$left = 'First text';
$right = 'Second text';

$diff = (new SimpleDiff)->compare($left, $right);

// Output the diff as plain text
echo '' . htmlspecialchars((string) $diff) . '';
```

### Get Changed Line Numbers

[](#get-changed-line-numbers)

```
$diff = (new SimpleDiff)->compare($left, $right);

echo 'Changed lines: ' . implode(', ', $diff->getChangedLines());
```

### Render Diff as HTML

[](#render-diff-as-html)

```
$simpleDiff = new SimpleDiff;
$diff = $simpleDiff->compare($left, $right);

// Returns styled HTML with color-coded changes
echo $simpleDiff->renderDiff($diff);
```

Output Format
-------------

[](#output-format)

### Plain Text Output

[](#plain-text-output)

The diff output uses a standardized format:

```
  1| unchanged line
- 2| removed·line·with·visible·spaces
+ 2| added→→→→line·with·visible·tabs
  3| another unchanged line

```

**Format explanation:**

- Lines starting with `  ` (two spaces) are unchanged
- Lines starting with `- ` indicate content from the original (left) text
- Lines starting with `+ ` indicate content from the target (right) text
- Line numbers are right-padded and followed by `| `
- Spaces are rendered as `·` (middle dot)
- Tabs are rendered as `→→→→` (four arrows)

### HTML Output

[](#html-output)

The `renderDiff()` method generates HTML with inline styles:

```

  1| unchanged line
- 2| removed line
+ 2| added line
  3| another unchanged line

```

**Color coding:**

- **Green background** (`#a2f19c`): Added lines (prefixed with `+`)
- **Red background** (`#e7acac`): Removed lines (prefixed with `-`)
- **No background**: Unchanged lines

Visual Examples
---------------

[](#visual-examples)

### Plain Text Diff Output

[](#plain-text-diff-output)

[![Plain text diff](doc/simple-diff.png)](doc/simple-diff.png)

### HTML Rendered Diff

[](#html-rendered-diff)

[![HTML rendered diff](doc/diff-to-html.png)](doc/diff-to-html.png)

Comparison Modes
----------------

[](#comparison-modes)

### Non-Strict Mode (Default)

[](#non-strict-mode-default)

In non-strict mode (default), the library normalizes line endings before comparison:

- Converts `\r\n` (Windows) to `\n`
- Converts `\r` (old Mac) to `\n`
- Trims leading and trailing whitespace from both inputs

This mode is ideal for comparing content where line ending differences should be ignored.

```
// Non-strict comparison (default)
$diff = (new SimpleDiff)->compare($left, $right);
$diff = (new SimpleDiff)->compare($left, $right, false);
```

### Strict Mode

[](#strict-mode)

Strict mode preserves the original line endings and whitespace, useful when you need to detect differences in line termination characters.

```
// Strict comparison - preserves line endings
$diff = (new SimpleDiff)->compare($left, $right, true);
```

Working with the Diff Object
----------------------------

[](#working-with-the-diff-object)

### Accessing Original and Target Text

[](#accessing-original-and-target-text)

```
$diff = (new SimpleDiff)->compare($left, $right);

// Get the normalized original text
$original = $diff->getOriginal();

// Get the normalized target text
$target = $diff->getTarget();
```

### Getting the Raw Diff String

[](#getting-the-raw-diff-string)

```
$diff = (new SimpleDiff)->compare($left, $right);

// Using getter method
$diffString = $diff->getDiff();

// Using string casting (equivalent)
$diffString = (string) $diff;
```

### Working with Changed Lines

[](#working-with-changed-lines)

```
$diff = (new SimpleDiff)->compare($left, $right);
$changedLines = $diff->getChangedLines();

// Example output: [2, 5, 8] - lines 2, 5, and 8 were modified
foreach ($changedLines as $lineNumber) {
    echo "Line {$lineNumber} was changed\n";
}

// Check if any changes occurred
if (count($changedLines) === 0) {
    echo "No differences found!";
}
```

Advanced Examples
-----------------

[](#advanced-examples)

### Comparing Files

[](#comparing-files)

```
$originalFile = file_get_contents('/path/to/original.txt');
$modifiedFile = file_get_contents('/path/to/modified.txt');

$simpleDiff = new SimpleDiff;
$diff = $simpleDiff->compare($originalFile, $modifiedFile);

// Check if files are identical
if (empty($diff->getChangedLines())) {
    echo "Files are identical.";
} else {
    echo "Files differ on lines: " . implode(', ', $diff->getChangedLines());
    echo "\n\n";
    echo $diff;
}
```

### Custom HTML Rendering

[](#custom-html-rendering)

If you need custom styling, you can process the diff string yourself:

```
$diff = (new SimpleDiff)->compare($left, $right);

$lines = explode("\n", $diff->getDiff());
$html = '';

foreach ($lines as $line) {
    $firstChar = $line[0] ?? '';
    $cssClass = match ($firstChar) {
        '+' => 'diff-added',
        '-' => 'diff-removed',
        default => 'diff-unchanged',
    };
    $html .= sprintf('%s', $cssClass, htmlspecialchars($line));
}

$html .= '';
echo $html;
```

### Integration with Version Control Display

[](#integration-with-version-control-display)

```
function showCommitDiff(string $oldContent, string $newContent): string
{
    $simpleDiff = new SimpleDiff;
    $diff = $simpleDiff->compare($oldContent, $newContent);

    $changedCount = count($diff->getChangedLines());

    $output = "Changes: {$changedCount} line(s) modified";
    $output .= $simpleDiff->renderDiff($diff);

    return $output;
}
```

Author
------

[](#author)

**Jan Barášek** -

📄 License
---------

[](#-license)

`baraja-core/simple-php-diff` is licensed under the MIT license. See the [LICENSE](https://github.com/baraja-core/simple-php-diff/blob/master/LICENSE) file for more details.

###  Health Score

50

—

FairBetter than 95% of packages

Maintenance73

Regular maintenance activity

Popularity37

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 90% 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 ~443 days

Total

5

Last Release

126d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3382204?v=4)[baraja](/maintainers/baraja)[@baraja](https://github.com/baraja)

---

Top Contributors

[![janbarasek](https://avatars.githubusercontent.com/u/4738758?v=4)](https://github.com/janbarasek "janbarasek (18 commits)")[![Alien426](https://avatars.githubusercontent.com/u/20882431?v=4)](https://github.com/Alien426 "Alien426 (1 commits)")[![imgbot[bot]](https://avatars.githubusercontent.com/in/4706?v=4)](https://github.com/imgbot[bot] "imgbot[bot] (1 commits)")

---

Tags

comparecomparisoncomparison-modesdefault-themediffhtmlphpphp-diff

###  Code Quality

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/baraja-core-simple-php-diff/health.svg)

```
[![Health](https://phpackages.com/badges/baraja-core-simple-php-diff/health.svg)](https://phpackages.com/packages/baraja-core-simple-php-diff)
```

###  Alternatives

[spatie/laravel-navigation

Manage menus, breadcrumbs, and other navigational elements in Laravel apps

5771.1M15](/packages/spatie-laravel-navigation)[bueltge/wordpress-multisite-enhancements

Enhance Multisite for Network Admins with different topics

1133.6k](/packages/bueltge-wordpress-multisite-enhancements)

PHPackages © 2026

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