Simple PHP Diff Script - Shows Line Changes in Bold Text

Author: Jacob Barkdull on Sunday, May 27 2012 Comments

Here's a simple PHP diff script I wrote for no particular reason. Its output is similar to how Wikipedia does it, though admittedly, a lot simpler and inferior. It works really well for predictable comparisons, like two files that are mostly the same or a directory listing where some files have been renamed, added or removed. However, I have no use for it, I was simply trying for proof of concept. Even if I have no use for it, somebody might, right?

Anyway, here's how it works.
  1. It loads two files (any file and its older version.)
  2. It slits (or "explodes") each line into an array and counts the number of lines.
  3. It then compares each line of the current file to its older version.
  4. If two lines match, the current file's line is displayed normally.
    • If two lines don't match it does the same process again, this time slitting each word into an array and comparing them to the words in the old file's line.
      • When two words don't match, the words from the current file's line are wrapped in HTML bold tags ("<b></b>") with a little style for color, and printed (or "echoed") on page.
  5. It then reads and displays the old version of the file.

PHP Source Code:

// Copyright (C) 2012 Jacob Barkdull
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU Affero General Public License as
//    published by the Free Software Foundation, either version 3 of the
//    License, or (at your option) any later version.
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    GNU Affero General Public License for more details.
//    You should have received a copy of the GNU Affero General Public License
//    along with this program.  If not, see <>.
// Script Description:
//    A simple PHP diff script I wrote for no particular reason. Its 
//    output is similar to how Wikipedia does it, though admittedly, a 
//    lot simpler and inferior. It works really well for predictable 
//    comparisons, like two files that are mostly the same or a directory 
//    listing where some files have been renamed, added or removed.

// Display source code
if (basename ($_SERVER['PHP_SELF']) === basename (__FILE__)) {
    if (isset (
$_GET['source'])) {
header ('Content-type: text/plain; charset=UTF-8');
        exit (
file_get_contents (basename (__FILE__)));

// Replace '<' and '>' Characters
function replace ($input)
str_replace (array ('<''>'), array ('&lt;''&gt;'), $input);

// Read files
$cf replace (file_get_contents ('testdoc.txt')); // Current Version
$of replace (file_get_contents ('testdoc_old.txt')); // Old Version

// Line Arrays
$cv explode ("\n"$cf);
$ov explode ("\n"$of);

// Count Lines - Set to Longer Version
$lc = (count ($cv) > count ($ov)) ? count ($cv) : count ($ov);

// Fix Mismatched Line Counts
for ($flc count ($ov); $flc $lc$flc++) {
$ov[$flc] = '';

// Begin HTML Table
echo '<table width="100%">'"\n<tbody>\n<tr>\n";

// Begin diff column
echo '<td valign="top">'"\nCurrent Version:<hr>\n<pre>\n";

for (
$l 0$l $lc$l++) {
// Word Arrays
$cw explode (' '$cv[$l]); // Current Version
$ow explode (' '$ov[$l]); // Old Version

    // Count Words - Set to Longer Version
$wc = (count ($cw) > count ($ow)) ? count ($cw) : count ($ow);

// Fix Mismatched Word Counts
for ($fwc count ($ow); $fwc $wc$fwc++) {
$ow[$fwc] = '';

// If each line is identical, just echo the normal line. If not,
    // check if each word is identical. If not, wrap colored "<b>"
    // tags around the mismatched words.
if ($cv[$l] !== $ov[$l]) {
        for (
$w 0$w $wc$w++) {
            if (
$cw[$w] === $ow[$w]) {
                echo (
$w !== ($wc 1)) ? ' ' "\n";
            } else {
'<b style="color: #00BB00;">'$cw[$w];
                echo (
$w !== ($wc 1)) ? '</b> ' "</b>\n";
    } else {
$cv[$l], "\n";

// End diff column
echo "</pre>\n</td>\n<td>&nbsp;</td>\n";

// Begin old version column
echo '<td valign="top">'"\nOld Version:<hr>\n<pre>\n";

// End old version column
echo "</pre>\n</td>\n";

// End HTML table
echo "</tr>\n</tbody>\n</table>";

Current Version:
This is the new file,
Here's an unchanged line,
This is totally awesome!
And here's whole new line!
  Old Version:
This is the old file,
Here's an unchanged line,
This is completely aweful!

If you think you could use this script for something, here is the source code: diff-script.php. If you make any changes, feel free to send them my way, someday I may need a script like this, so if you improve it that might mean a lot someday. Check out my other bits of code: here.

Let me know what you think in the comments. And enjoy!
Share This Page On...
Subscribe to Newsletter:
Advertisements: portfolio
On the blog...
HashOver Gets a Logo!
Regarding and Its Share Button
Did Brendan Eich Contribute to Firefox's Decline?
The NSA backdoor in "Linux"
The popularity of Firefox is definitely waning!
Critique of Gedit Syntax Highlighting + PHP Color Schemes