¿Cuál es la forma más fácil de resaltar la diferencia entre dos cadenas en PHP?
Estoy pensando en la línea de la página del historial de edición de Desbordamiento de pila, donde el nuevo texto está en verde y el texto eliminado está en rojo. Si hay algunas funciones o clases previamente escritas disponibles, sería ideal.
Acabo de escribir una clase para calcular el número más pequeño (no para ser tomado literalmente) de ediciones para transformar una cadena en otra cadena:
http://www.raymondhill.net/finediff/
Tiene una función estática para representar una versión HTML de la diferencia.
Es una primera versión, y es probable que se mejore, pero funciona bien ahora, por lo que la estoy lanzando por si alguien necesita generar un diferencial compacto de manera eficiente, como yo necesitaba.
Editar: ahora está en Github: https://github.com/gorhill/PHP-FineDiff
fuente
Si desea una biblioteca robusta, Text_Diff (un paquete PEAR) parece ser bastante bueno. Tiene algunas características geniales.
fuente
Este es bueno, también http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
fuente
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
Aquí hay una función corta que puede usar para diferenciar dos matrices. Implementa el algoritmo LCS :
Genera dos matrices:
Si llena una matriz con caracteres, se puede usar para calcular la diferencia en línea. Ahora solo un paso para resaltar las diferencias:
P.ej.:
Saldrá:
S
tackOerverFFaulAytNotas adicionales:
fuente
computeDiff is not found
También hay una extensión PECL para xdiff:
En particular:
Ejemplo del manual de PHP:
fuente
Tuve problemas terribles con las alternativas basadas en PEAR y las más simples que se muestran. Entonces, aquí hay una solución que aprovecha el comando Unix diff (obviamente, debe estar en un sistema Unix o tener un comando diff de Windows que funcione para que funcione). Elija su directorio temporal favorito y cambie las excepciones a códigos de retorno si lo prefiere.
fuente
Este es el mejor que he encontrado.
http://code.stephenmorley.org/php/diff-implementation/
fuente
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
con$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;
Lo que está buscando es un "algoritmo diff". Una búsqueda rápida en Google me llevó a esta solución . No lo probé, pero tal vez haga lo que necesita.
fuente
Un puerto php de Neil Frasers diff_match_patch (Apache 2.0 con licencia)
fuente
Recomendaría mirar estas increíbles funciones desde el núcleo de PHP:
similar_text - Calcula la similitud entre dos cadenas
http://www.php.net/manual/en/function.similar-text.php
levenshtein - Calcular la distancia de Levenshtein entre dos cuerdas
http://www.php.net/manual/en/function.levenshtein.php
soundex - Calcula la clave soundex de una cadena
http://www.php.net/manual/en/function.soundex.php
metaphone - Calcule la tecla metaphone de una cadena
http://www.php.net/manual/en/function.metaphone.php
fuente
Encontré esta clase PHP diff de Chris Boulton basada en Python difflib, que podría ser una buena solución:
PHP Diff Lib
fuente
Otra solución (para la comparación lado a lado en lugar de una vista unificada): https://github.com/danmysak/side-by-side .
fuente