2012-08-13 8 views
10

Zunächst einmal, das ist ein exaktes Duplikat dieser vier Fragen:PHP/JS Text Diff

es, als ob scheint Die Zeiten haben sich geändert, seit diese Fragen zuerst gestellt wurden, und ich frage mich, was ein gutes Werkzeug ist Jetzt für solche Vergleiche? Ich habe an (zusätzlich zu diesen Fragen) sah:

Aber all denen, die ich bekommen entweder unmantained jetzt oder scheinen etwas zwielichtig, dass sie nicht so oft benutzt werden (und manche weisen sogar darauf hin, dass sie nicht sehr performant sind) und die PEAR einer macht mir Sorgen. Ich hasse es, PEAR für ein kleines Modul nicht nur das zu installieren, aber es scheint wie ein Ziegelstein durch mein eigenes Fenster zu werfen, um es für solch ein kleines Modul im Vergleich zu PEAR im Allgemeinen nicht nur das zu installieren, aber das Modul wurde ersetzt und auf einem gelegt anderer Kanal (weiß nicht warum?). Ich würde die PEAR-Version verwenden, wenn es meine einzige Wahl ist, aber ich möchte das aktuelle Paket verwenden.

Kennt jemand eine gut verwendete und aktuell gepflegte oder eingebaute Funktion (auch wenn es sich um eine PHP-Erweiterung handelt) text diff für PHP und/oder JavaScript (auch JQuery)?

Antwort

2

Ok, so ist es eine Weile her.

Ich beschloss tatsächlich, sich umzusehen, was andere Leute verwenden und stolperte darüber, was Yii (http://www.yiiframework.com10) verwendet.

Sie verwenden tatsächlich das PEAR-Modul für ihre text_diff und sie verwenden es in seiner neuen Form auf dem Horde-Kanal. Es scheint, dass text_diff jetzt ein Horde-Projekt ist, aber Sie können genauso einfach eine Version davon in Ihre Anwendung integrieren und das ist, was Yii standardmäßig tut (es kommt mit einer Version davon vorgebündelt).

Also suchte ich ein wenig herum, um herauszufinden, wie sie es verwendet und wie in sie zu erhalten und ich kam in:

public function actionDiff() 
{ 
    Yii::import('gii.components.TextDiff'); 

    $model=$this->prepare(); 
    if(isset($_GET['id']) && isset($model->files[$_GET['id']])) 
    { 
     $file=$model->files[$_GET['id']]; 
     if(!in_array($file->type,array('php', 'txt','js','css'))) 
      $diff=false; 
     elseif($file->operation===CCodeFile::OP_OVERWRITE) 
      $diff=TextDiff::compare(file_get_contents($file->path), $file->content); 
     else 
      $diff=''; 

     $this->renderPartial('/common/diff',array(
      'file'=>$file, 
      'diff'=>$diff, 
     )); 
    } 
    else 
     throw new CHttpException(404,'Unable to find the code you requested.'); 
} 

In CCodeGenerator für ihre Gii Modul (http://www.yiiframework.com/doc/api/1.1/CCodeGenerator/). Der wichtige Teil ist, wo sie tatsächlich in das Modul PEAR Hook:

$diff=TextDiff::compare(file_get_contents($file->path), $file->content); 

in dem Inhalt von zwei Dateien zu lesen, die eine diffed Ausgabe erzeugt.

Ursprünglich wollte ich nicht PEAR wegen der Bloat verwenden, aber dieses Modul ist ziemlich schlank für eine voll ausgestattete text_diff, also habe ich beschlossen, damit zu gehen. Nicht nur das, aber im Moment ist es das einzige text_diff Modul, das wirklich für mich gearbeitet hat, also bleibe ich bei den Besten, auch wenn das Beste ziemlich speicherhungrig ist.

1

Haben Sie eine der beiden Lösungen von Philippe unter this thread ausprobiert?

hier Zitat:

In PHP. array_diff vergleicht das erste mit dem zweiten Array und gibt die Differenz zurück.

$a1 = str_split('abcdefghijklmnop'); 
$a2 = str_split('abcdefghi'); 
echo join('', array_diff($a1, $a2)); // jklmnop 

Dies wird auch funktionieren:

$s1 = 'abcdefghijklmnop'; 
$s2 = 'abcdefghi'; 
echo str_replace(str_split($s2), '', $s1); // jklmnop 

Diese $s2 = 'ghiabcdef'; auch handhaben konnte, weil str_replace() mit einem Array zugeführt wird, kein String.

+0

In der Tat gibt es mir den Unterschied, und ich denke daran, diese auch zu verwenden, obwohl, wenn zwei Unterschiede, sagen, Beschreibungen eines Buches, eine aus meiner eigenen internen Datenquelle und eine aus einer externen Daten angezeigt werden wollte Quelle? Wie der SO-Editor. – Sammaye

+0

Ja, ich kenne keine einfache Möglichkeit, zwei Textblöcke zu vergleichen, nur zwei Zeichenfolgen. Hoffentlich hat jemand anderes ein paar Vorschläge. –

Verwandte Themen