Qual é a maneira mais fácil de destacar a diferença entre duas strings no PHP?
Estou pensando nas linhas da página Histórico de edições do estouro de pilha, onde o novo texto está em verde e o texto removido está em vermelho. Se houver alguma função ou classe pré-escrita disponível, isso seria o ideal.
Acabei de escrever uma classe para calcular o menor número (não para ser tomado literalmente) de edições para transformar uma string em outra string:
http://www.raymondhill.net/finediff/
Ele tem uma função estática para renderizar uma versão HTML do diff.
É uma primeira versão, e provavelmente será aprimorada, mas funciona muito bem a partir de agora, então estou lançando-a no caso de alguém precisar gerar um diff compacto com eficiência, como eu precisava.
Edit: Já está no Github: https://github.com/gorhill/PHP-FineDiff
fonte
Se você deseja uma biblioteca robusta, o Text_Diff (um pacote PEAR) parece ser muito bom. Tem alguns recursos bem legais.
fonte
Essa é boa, também http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
fonte
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
Aqui está uma função curta que você pode usar para diferenciar duas matrizes. Ele implementa o algoritmo LCS :
Ele gera duas matrizes:
Se você preencher uma matriz com caracteres, ela poderá ser usada para calcular a diferença embutida. Agora, apenas um passo para destacar as diferenças:
Por exemplo.:
Saída:
S
tackOerverfFaulowtNotas Adicionais:
fonte
computeDiff is not found
Há também uma extensão PECL para xdiff:
Em particular:
Exemplo do manual do PHP:
fonte
Eu tive um problema terrível com as alternativas baseadas em PEAR e as mais simples mostradas. Então, aqui está uma solução que aproveita o comando diff do Unix (obviamente, você precisa estar em um sistema Unix ou ter um comando diff do Windows em funcionamento para que ele funcione). Escolha seu diretório temporário favorito e altere as exceções para retornar códigos, se você preferir.
fonte
Este é o melhor que eu encontrei.
http://code.stephenmorley.org/php/diff-implementation/
fonte
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
por$sequence1 = preg_split('//u', $string1, -1, PREG_SPLIT_NO_EMPTY); $sequence2 = preg_split('//u', $string2, -1, PREG_SPLIT_NO_EMPTY); $end1 = count($sequence1) - 1; $end2 = count($sequence2) - 1;
O que você está procurando é um "algoritmo diff". Uma rápida pesquisa no Google me levou a esta solução . Não testei, mas talvez faça o que você precisa.
fonte
Uma porta php de Neil Frasers diff_match_patch (licença Apache 2.0)
fonte
Eu recomendaria olhar para essas funções impressionantes do núcleo do PHP:
similar_text - Calcula a similaridade entre duas strings
http://www.php.net/manual/en/function.similar-text.php
levenshtein - Calcule a distância de Levenshtein entre duas cordas
http://www.php.net/manual/en/function.levenshtein.php
soundex - Calcula a tecla soundex de uma string
http://www.php.net/manual/en/function.soundex.php
metafone - Calcule a chave de metafone de uma string
http://www.php.net/manual/en/function.metaphone.php
fonte
Me deparei com esta classe diff de PHP de Chris Boulton, baseada no Python difflib, que poderia ser uma boa solução:
PHP Diff Lib
fonte
Outra solução (para comparação lado a lado em oposição a uma exibição unificada): https://github.com/danmysak/side-by-side .
fonte