Print difference between two strings in php

Hi,

I need to compare two strings and print difference, for example:
$str1='some-content-here-example';
$str2='some-content-example';
difference: -here

Thanks for any help.
LVL 8
ZadoAsked:
Who is Participating?
 
Ray PaseurConnect With a Mentor Commented:
Here is a tested code example using the test data provided in the original post.  But I expect this is not really what you need, and that there is some sub-hierarchy to your actual, live data.
<?php // RAY_temp_zado.php
error_reporting(E_ALL);
echo "<pre>";

// TEST DATA FROM THE POST AT EE
$str1='some-content-here-example';
$str2='some-content-example';

// MAKE ARRAY SO WE CAN USE AN ITERATOR
$arr1 = str_split($str1);
$arr2 = str_split($str2);

// SET ERROR REPORTING SO WE CAN USE UNDEFINED VALUES AS NULLS
error_reporting(E_ALL ^ E_NOTICE);

// EAT THE ARRAYS FROM THE FRONT
foreach ($arr1 as $ptr => $ltr)
{
    if ($arr2[$ptr] == $ltr)
    {
        unset($arr1[$ptr]);
        unset($arr2[$ptr]);
        continue;
    }
}

// EAT THE ARRAYS FROM THE REAR
$arr1 = array_reverse($arr1);
$arr2 = array_reverse($arr2);
foreach ($arr1 as $ptr => $ltr)
{
    if ($arr2[$ptr] == $ltr)
    {
        unset($arr1[$ptr]);
        unset($arr2[$ptr]);
        continue;
    }
}

// WHICH ONE IS BIGGER"
$cnt1 = count($arr1);
$cnt2 = count($arr2);

if ($cnt1 > $cnt2)
{
    echo implode(NULL, array_reverse($arr1));
}
else
{
    echo implode(NULL, array_reverse($arr2));
}

Open in new window

0
 
ZadoAuthor Commented:
doesn't help much, but thanks.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
MogalManicCommented:
0
 
ZadoAuthor Commented:
How to make it work?
I set $old and $new variables and try to get some output with echo htmlDiff(); and echo diff(); but I have only 'Array' displayed.
0
 
ZadoAuthor Commented:
Ok, got it: echo htmlDiff($old, $new);
Thanks.
0
 
darren-w-Commented:
A bit rough and ready

<?php

$str1 = 'some-content-here-example';
$str2 = 'some-content-example';
$str1sp = preg_split('//', $str1, -1);
$str2sp = preg_split('//', $str2, -1);

$l1 = count($str1sp);
$l2 = count($str2sp);

$length = $l1;
if ($l2 > $l1) {
    $length = $l2;
}
$result = null;
$x = null;
for ($x = 0; $x < $length; $x++) {
    if ($str1[$x] != $str2[$x]) {
        if (!isset($str1[$x])) {
            $result.= $str2[$x];
        } else {
            $result.= $str1[$x];
        }
    }
}

echo $result;
?>

Open in new window

0
 
ZadoAuthor Commented:
Thanks Darren, but it displays difference and rest of string after that, doesn't work properly.
@MogalManic, how to diplay the difference only instead mark it as delete <del> in whole string? I keep trying do this but with no proper results. Thanks.
0
 
Ray PaseurCommented:
Hi, Zado.  You may or may not have realized it, but you're into one of the classic problems in computer science.  The definition of "difference" is critical to understanding the issue.  Look at this:

$str1='some-content-here-example';
$str2='some-content-example';

You can say that these strings are different at '-here' or at 'here-'.  But this string has only ONE substring difference, so it may be useful only in one small example, not in the abstract solution that you need for all those strings of dates and parenthetical expressions.  I can show you how to start at either end and compare character-by-character until a difference is isolated, but that might not really be what you want.  If you want to give us some more detail about the problem, and some actual test data, you will get a better answer.

And somewhere along the process you may conclude, as I did when I started reading your questions, that it's going to be better to load this data into a data base and process it from the data base, instead of trying to string-manipulate every question.

Some value in understanding this:
http://us.php.net/manual/en/function.levenshtein.php
http://us.php.net/manual/en/function.similar-text.php


Best regards, ~Ray
0
 
MogalManicCommented:
The htmlDiff() function splits the function by word (space delimeter).  If you want to compare by character, then change the line from
      $diff = diff(explode(' ', $old), explode(' ', $new));
to
      $diff = diff(str_split($old), str_split($new));

There is a side effect though.  It adds spaces in the implode() method call.  Just replace the " " with "".
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.