Regina Schaukrug: Änderungen anzeigen

Beitrag lesen

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