Ottimo il codice di Tro4, è proprio quello che mi serviva.
Non ti funzionava perché mancavano un paio di if qua e là.
Mi sono permesso di correggerlo e, almeno per quello che mi serve, ora funziona egregiamente e senza errori né warning:
Codice PHP:
/*LA FUNZIONE RESTITUISCE IL TESTO SOTTOLINEANDO LE DIFFERENZE */
function cambiato($testo, $old_tac)
{
$stringa1 = stripslashes($testo);
$stringa2 = stripslashes($old_tac);
$return = '';
$thelf = chr(10);
$thecr = chr(13);
$thecrlf = array ($thecr.$thelf, $thelf.$thecr, $thecr, $thelf);
// faccio questo per preservare gli accapo
$stringa1 = str_replace($thecrlf, '{NL}', $stringa1);
$stringa2 = str_replace($thecrlf, '{NL}', $stringa2);
$array1 = preg_split('#\s+#si', $stringa1);
$array2 = preg_split('#\s+#si', $stringa2);
// ricerchiamo la stringa di lunghezza massima
$count_array1 = count($array1);
$count_array2 = count($array2);
$massimo = max ($count_array1, $count_array2);
$j = 0;
// scandiamo parola per parola e facciamo i vari confronti
for ($i = 0; $i < $massimo; $i++)
{
//if (($i >= $count_array1) || ($i >= $count_array2)) break;
//if (($j >= $count_array1) || ($j >= $count_array2)) break;
if (($i >= $count_array1) || ($j >= $count_array2)) break;
$k = 1;
$cicla = true;
// le due parole sono uguali, non c'è stata modifica. stampiamo la parola e passiamo alla successiva
if ($array1[$i] == $array2[$j])
{
$j++;
$return .= $array1[$i]." ";
}
else // le due parole sono diverse
{
while ($cicla)
{
//if ($i >= $count_array1) break;
//if ($j >= $count_array2) break;
//if (($i + $k) >= $count_array1) break;
//if (($j + $k) >= $count_array2) break;
$stringa = '';
$stringa_2 = '';
/* CONTROLLO TESTO AGGIUNTO */
if ($array1 [$i] == $array2 [$j + $k])
{
// controlliamo se la parola del testo vecchio è uguale ad una parola k spazi + avanti
// del testo nuovo, in tal caso nel nuovo testo sono state aggiunte k parole.
for ($n = 0; $n < $k; $n++)
{
// stampiamo in verde e grassetto le parole aggiunte
if ($n < ($k - 1)) $stringa .= $array2 [$j + $n] . " ";
else $stringa .= $array2 [$j + $n];
}
$return .= '<font color="green">[b]'.$stringa.'[/b]</font> '.$array1[$i].' ';
$cicla = false;
$j = $j + $k + 1;
}
else
{
/* CONTROLLO TESTO ELIMINATO */
if ($array1 [$i + $k] == $array2 [$j])
{
// controlliamo se la parola del testo nuovo è uguale ad una parola k
// spazi + avanti del testo vecchio, in tal caso nel nuovo testo sono state eliminate k parole.
for ($n = 0; $n < $k; $n++)
{
// stampiamo barrato e in rosso la porzione di testo vecchio eliminata nel testo nuovo
if ($n < ($k - 1)) $stringa .= $array1 [$i + $n]." ";
else $stringa .= $array1 [$i + $n];
}
$cicla = false;
$return .= '<font color="red"><strike>'.$stringa.'</strike></font> '.$array2[$j].' ';
$j = $j + 1;
$i = $i + $k;
}
else
{
for ($n = 1; $n <= $k; $n++)
{
/* CONTROLLO SCAMBIO TESTO */
if ($array1 [$i + $k] == $array2 [$j + $n])
{
// controlliamo se una parola compresa tra 1 e k-1 passi del testo nuovo
// è uguale alla parola k passi + avanti del testo vecchio
for ($r = 0; $r < $k; $r++)
{
if ($r < ($k - 1)) $stringa .= $array1 [$i + $r]." ";
else $stringa .= $array1 [$i + $r];
}
for ($r = 0; $r < $n; $r++)
{
// stampiamo le parole del testo vecchio che sono state sostituite in rosso
// barrato e in verde grassetto quelle che sono state aggiunte al loro posto
if ($r < ($n - 1)) $stringa_2 .= $array2 [$j + $r]." ";
else $stringa_2 .= $array2 [$j + $r];
}
$return .= '<font color="red"><strike>'.$stringa.'</strike></font> <font color="green">[b]'.$stringa_2.'[/b]</font> '.$array1[$i+$k].' ';
$cicla = false;
$i = $i + $k;
$j = $j + $n + 1;
$n = $k;
}
else
{
/* CONTROLLO SCAMBIO TESTO */
if ($array1 [$i + $n] == $array2 [$j + $k])
{
// controlliamo se una parola compresa tra 1 e k-1 passi del testo vecchio è
// uguale alla parola k passi + avanti del testo nuovo
for ($r = 0; $r < $n; $r++)
{
if ($r < ($n - 1)) $stringa .= $array1 [$i + $r]." ";
else $stringa .= $array1 [$i + $r];
}
for ($r = 0; $r < $k; $r++)
{
if ($r < ($k - 1)) $stringa_2 .= $array2 [$j + $r]." ";
// stampiamo le parole del testo vecchio che sono state sostituite in rosso
// barrato e in verde grassetto quelle che sono state aggiunte al loro posto
else $stringa_2 .= $array2 [$j + $r];
}
$return .= '<font color="red"><strike>'.$stringa.'</strike></font> <font color="green">[b]'.$stringa_2.'[/b]</font> '.$array1[$i+$n].' ';
$cicla = false;
$i = $i + $n;
$j = $j + $k + 1;
$n = $k;
}
}
}
}
}
$k++; //incrementiamo il numero di passi da controllare
}
}
}
if (!empty ($return))
{
// rimetto gli accapo (solo il LF, che poi sostituirò con
)
$return = str_replace('{NL}', $thelf, $return);
}
return $return; //restituiamo la stringa di testo nuovo con evidenziate le modifiche
}
Vi prego di aggiornare questo post nel caso ci sia qualcuno che migliora questa funzione con nuove funzionalità, ok?
Ciao a tutti!