diff gibts als Linux-Programm. Arbeitet zeilenweise. Ich vermute deshalb mal Meowsalot will NICHT sowas:
<?php
class stringDiff {
public $str_old = "";
public $str_new = "";
private $file_old = "";
private $file_new = "";
function __construct () {
$this -> file_old = `mktemp`;
$this -> file_new = `mktemp`;
}
function __destruct() {
unlink( $this -> file_old );
unlink( $this -> file_new );
}
function getDiff( $str_old, $str_new ) {
file_put_contents( $this -> file_old, $str_old ) ;
file_put_contents( $this -> file_new, $str_new ) ;
$file_old = $this -> file_old;
$file_new = $this -> file_new;
return `diff "$file_old" "$file_new"`;
}
function printDiff($str_old, $str_new, $tagName='pre') {
echo '<' . $tagName . '>' . htmlspecialchars( $this -> getDiff( $str_old, $str_new ) ) . '</' . $tagName . '>';
}
}
# Test:
$str[] = "Hat der alte Hexenmeister
sich doch einmal
wegbegeben
und nun sollen seine Geister
auch nach meinem
Wille leben!";
$str[] = "Hat der alte Hexenmeister
sich doch nochmal
herbegeben
und nun sollen meine Geister
auch nach seinem
Wille leben!";
$oDiff=new stringDiff();
echo $oDiff -> getDiff( $str[0],$str [1] );
Output:
2,5c2,5
< sich doch einmal
< wegbegeben
< und nun sollen seine Geister
< auch nach meinem
---
> sich doch nochmal
> herbegeben
> und nun sollen meine Geister
> auch nach seinem
Jetzt könnte man die Strings nehmen, alle Leerzeichen durch Zeilenumbrüche ersetzen
echo $oDiff -> getDiff( str_replace (" ", "\n", $str[0] ) ,str_replace (" ", "\n", $str [1]) );
und bekäme eine nette Liste... mit der man weitermachen kann:
7,8c7,8
< einmal
< wegbegeben
---
> nochmal
> herbegeben
12c12
< seine
---
> meine
16c16
< meinem
---
> seinem