Back-End

14 abr, 2014

Mostrando as diferenças entre duas strings e modificando uma para se obter a outra

Publicidade

A classe PHP Text Diff Highlight é muito objetiva. Uma vez que você tenha criado um objeto dessa classe, apenas chame a função diff, passando como parâmetro o texto inicial e uma referência a um objeto que passa valores de parâmetros e retorna os resultados da operação diff.

 $difference = new stdClass;
 $difference->mode = 'w';
 $before = 'Some text before';
 $after = 'This is the text after';
 $diff = new diff_class;
 if(!$diff->diff($before, $after, $difference))
 {
   die($diff->error);
 }
 else
 {
    echo 'Changes: '.print_r($difference->differences, 1);
 }

A classe também pode mostrar as diferenças entre as duas sequências usando a função formatDiffAsHtml em vez da função diff. Ele constrói uma string de caracteres HTML com o texto adicionado marcado com sublinhado e negrito, e o texto removido, em estilo tachado. Você pode configurar os estilos para a apresentação dos textos adicionados e removidos.

As mudanças formatadas no HTML podem ser usadas para exibir as diferenças para o usuário em uma página da web.

 if($diff->formatDiffAsHtml($before, $after, $difference))
 {
   echo '<div>', $difference->html, '</div>';
 }

As diferenças entre as strings será mostrada desta forma:

Algum Este é o texto antesdepois

Comparando strings por caracteres, palavras ou linha

A comparação entre as duas strings de texto pode ser feita de três modos: por linha, por palavra para texto normal, ou por caractere, o que é mais adequado para a comparação de strings de dados binários.

O modo de comparação é configurado ao definir o parâmetro diference do diff ou funções formatDiffAsHtml. Os valores das opções de modo são ‘c’ para o caractere, ‘w’ para a palavra e ‘l’ para a linha.

Obtendo a string final ao fazer o patch da string original

A lista de mudanças entre a string original e a string final é retornada como uma matriz na variável differences e no parâmetro $difference do objeto. Essa matriz pode ser usada para reconstruir a string final, chamando a função patch, passando a string inicial como parâmetro.

Você precisa definir a variável patch do parâmetro $difference do objeto para true de forma a poder fazer a classe retornar todos os dados que a função de patch precisa para reconstruir a string final.

A função patch retorna a string após o patch como a variável after do parâmetro afterPatch do objeto.

 $difference = new stdClass;
 $difference->mode = 'w';
 $difference->patch = true;
 $afterPatch = new stdClass;
 if($diff->diff($before, $after, $difference)
 && $diff->patch($before, $difference->differences, $afterPatch))
 {
   echo 'The before text patched with the differences is: '.
     $afterPatch->after;
 }

Mostrando o Diff e o texto de patch em JavaScript

Se você precisa ver as diferenças entre o texto original e um texto que está sendo editado em um formulário, vai precisar da versão JavaScript da classe PHP, que é o objeto JS Diff Viewer.

O objeto JavaScript fornece exatamente a mesma funcionalidade de encontrar as diferenças entre as strings de texto, mostrando as diferenças formatadas como HTML e fazendo o patch do texto original para reconstruir o texto final com a lista de diferenças.

Há um outro artigo semelhante a este para explicar como usar esse objeto JavaScript para visualizar as diferenças e as strings de texto de patch em JavaScript.

Conclusão

Esta classe PHP e o objeto JavaScript são muito úteis para a visualização das diferenças entre duas strings em uma página web. Se você tem outras necessidades que gostaria que essas classes fizessem ou tiver qualquer outra pergunta, basta colocar um comentário neste artigo.

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.phpclasses.org/blog/package/8331/post/1-Showing-the-Diff-between-Two-Strings-and-Patch-one-to-get-the-Other-in-PHP-and-JavaScript.html