2012-08-13 24 views
10

primer lugar, este es un duplicado exacto de estas cuatro preguntas:PHP/JS Texto Dif

Parece como si los tiempos han cambiado desde que se hicieron estas preguntas por primera vez y me pregunto qué es una buena herramienta ahora-a-días para este tipo de comparación? He mirado (adicionalmente a estas preguntas):

Pero todos los que me dan son bien unmantained ahora o parecer una poco fiable ya que no se usan tanto (y algunos incluso insinúan que no son muy efectivos) y el PEAR me preocupa. Odio instalar PEAR para un pequeño módulo no solo eso, sino que parece lanzar un ladrillo a través de mi propia ventana para instalarlo en un módulo tan pequeño en comparación con PEAR en general, no solo eso, sino que el módulo ha sido reemplazado y colocado en un diferente canal (no sé por qué?). Usaría la versión PEAR si es mi única opción, pero quiero usar el paquete actualizado.

¿Alguien sabe de una función bien usada y actualmente mantenida o incorporada (incluso si es una extensión PHP) de texto diff para PHP y/o JavaScript (JQuery también)?

Respuesta

2

Ok, así que ha pasado un tiempo.

De hecho, decidí echar un vistazo a lo que otras personas usan y tropecé con lo que usa Yii (http://www.yiiframework.com).

En realidad usan el módulo PEAR para su text_diff y lo usan en su nueva forma en el canal de horde. Parece que text_diff es ahora un proyecto de horde, pero puedes integrar fácilmente una versión de él en tu aplicación y eso es lo que hace Yii por defecto (viene incluido con una versión).

así que busqué un poco para averiguar cómo se utilizan y cómo entrar en ella y me encontré con:

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.'); 
} 

En CCodeGenerator por su módulo de Gii (http://www.yiiframework.com/doc/api/1.1/CCodeGenerator/). La parte importante es donde realmente se enganchan en el módulo PEAR:

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

Al leer en el contenido de dos archivos que produce una salida diffed.

Originalmente no quería usar PEAR debido a la hinchazón, pero este módulo es bastante delgado para un text_diff con todas las funciones, así que he decidido ir con esto. No solo eso, por el momento, es el único módulo text_diff que realmente me ha funcionado, así que estoy manteniendo lo mejor, incluso si lo mejor está hambriento de memoria.

1

¿Has probado una de las dos soluciones de Philippe en this thread?

citado aquí:

En PHP. array_diff compara el primero con el segundo conjunto y devuelve la diferencia.

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

Esto funciona así:

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

Esto podría manejar $s2 = 'ghiabcdef'; así porque str_replace() se alimenta con una matriz , no una cadena.

+0

De hecho, me da la diferencia y estoy pensando en usar también esta, aunque si quería mostrar diferencias entre dos, por ejemplo, descripciones de un libro, una de mi fuente interna de datos y otra de datos externos ¿fuente? Me gusta el editor SO. – Sammaye

+0

Sí, no sé de ninguna manera fácil de comparar dos bloques de texto, solo dos cadenas. Con suerte, alguien más tendrá algunas sugerencias. –

Cuestiones relacionadas