confrontare due testi


Vediamo oggi come analizzare due testi e come stampare il punto in cui c’è la differenza.

Questo metodo è lo stesso utilizzato in http://www.thecsea.it/servizi/comp_testi

Creiamo una funzione che dati in ingresso le due stringhe(testi) restituisce un valore >= 0 che indica la posizione in cui differiscono;-1 se sono uguali; -2 se la prima stringa è più corta, ma fino alla fine della prima stringa le due stringhe sono uguali; -3 se la seconda stringa è più corta, ma fino alla fine della seconda stringa le due stringhe sono uguali.

Analizziamo il codice, le stringhe in questo caso vengono lette da due file.

<?php
/*
>= 0 	-> posizione errore
-1 		-> identiche
-2 		-> lunghezza diversa e fino alla fine della prima stringa sono uguali
-3 		-> lunghezza diversa e fino alla fine della seconda stringa sono uguali
*/
function check($txt1,$txt2){
	$len[1] = strlen($txt1);
	$len[2] = strlen($txt2);
	$len[0] = $len[1];
	if($len[1] > $len[2])
		$pos_len = 2;
	elseif($len[2] > $len[1])
		$pos_len = 1;
	else
		$pos_len = 0;
	
	for ($i=0;$i<$len[$pos_len];$i++)
		if($txt1[$i] != $txt2[$i])
			return $i;
	return -($pos_len+1);
}


$txt1 = fopen("1.txt","r");
$txt1 = fread($txt1,filesize("1.txt"));
$txt2 = fopen("2.txt","r");
$txt2 = fread($txt2,filesize("2.txt"));
$pos = check($txt1,$txt2);
if($pos>=0)
	print "posizione differenza : ".$pos. "\n<h1>testo consecutivo alla differenza :</h1>\n<h2>primo</h2>\n<pre>" .htmlentities(substr($txt1,$pos),ENT_QUOTES,"utf-8"). "</pre><h2>secondo</h2>\n<pre>" .htmlentities(substr($txt2,$pos),ENT_QUOTES,"utf-8")."</pre>";
elseif($pos==-1)
	print "le due stringhe sono uguali";
elseif($pos==-2)
	print "la prima stringa è più corta, ma fino alla fine della prima stringa le due stringhe sono uguali";
elseif($pos==-3)
	print "la seconda stringa è più corta, ma fino alla fine della seconda stringa le due stringhe sono uguali";
else
	print "ERRORE";
?>

In pratica per confrontare due file basta leggerli e passarli come parametro alla funzione, controllo il valore di ritorno e stampo i vari messaggi ad esso collegati, in particolare se mi ritorna un valore >= 0 stampo i due testi dal punto in cui è stata rilevata la differenza e trami htmlentietes faccio si che i caratteri speciali vangano convertiti.

La funzione è abbastanza semplice per quanto riguarda il normale controllo della differenza, mentre per gli altri casi viene utilizzata un’apposita variabile.

In particolare all’inizio si calcolano le lunghezze delle stringhe e li si memorizzano in un vettore di 3 elementi, la 3 lunghezza è uguale alla prima, perché serve quando le lunghezze sono uguali, in modo da evitare controlli futuri, ma avere un valore apposito.
In seguito controllo se le due stringhe sono uguali o quale è la loro disuguaglianza, in termini di lunghezza, in particolare se la prima è maggiore assegno 2 a pos_len, se la seconda è maggiore assegno 1 se no 3.
Quindi così nel for, di controllo carattere per carattere, itero solo un numero sufficiente di volte in particolare itero fino a quando ho finito di leggere la stringa più piccola, se trovo differenze ritorno il punto della differenza; se no ritorno pos_len cambiando di segno e con sommato uno, dato che gli altri ritorni partono da -1 e non da 0.

N.B. Se si vogliono scoprire le differenze successive si può fare un ciclo che richiama la funzione partendo dalla posizione dell’ultima differenza incrementata di uno e che memorizzi le altre in un array.

CC BY-SA 4.0 confrontare due testi by cardinale claudio is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Lascia un commento