I have some problems with my jQuery "compare" function. Its mission is to compare two text areas and highlight the differences.
eg. "My name is Michael" in one text area, and "My name is Michel" in another.
My function shall return both inputs and highlight the char "a" from the first input, and highlight a missing char from the second.
This is how the function looks so far, but it doesn't seem to work 100% of the time.
$(function () {
$('#btnCompare').on('click', function () {
compare();
});
function compare() {
$('#divColLeft').empty();
$('#divColRight').empty();
var textOne = $('#taOneComp').val();
var textTwo = $('#taTwoComp').val();
var output;
var outputX;
var arrTextOne = [];
var arrTextTwo = [];
for (var i = 0; i < textOne.length; i++) {
output = textOne.charAt(i);
arrTextOne.push(output);
}
for (var x = 0; x < textTwo.length; x++) {
outputX = textTwo.charAt(x);
arrTextTwo.push(outputX);
}
$.each(arrTextOne, function (y, e) {
if ($.inArray(e, arrTextTwo) == -1) {
$('#divColLeft').append(e);
$('#divColLeft').highlight(e);
} else {
$('#divColLeft').append(arrTextOne[y]);
}
});
$.each(arrTextTwo, function (z, f) {
if ($.inArray(f, arrTextOne) == -1) {
$('#divColRight').append(f);
$('#divColRight').highlight(f);
} else {
$('#divColRight').append(arrTextTwo[z]);
}
});
}
});
Update: To be more precise and improve the original question
If some includs the char "a" before any of the two texts, this is a difference that should be highlighted. In the first text the "a" should be highlighted, in the second text i want to input an empty space that is highlighting the difference(the missing char).
Your code will work only if the two strings has the exact same length and the same words arrangement, otherwise it will break down i.e. if you add an extra character at the beginning of the tested string.
after some coding i managed to come up with the code below, it compares two strings and find missing charcters/words, extra characters/words and wrong spellings:
function compare() {
var elm1 = document.getElementById("div1"),
elm2 = document.getElementById("txt"),
output = document.getElementById("div2"),
txt1 = elm1.innerHTML, //original text
txt2 = elm2.value, //submitted text
arr1 = txt1.split(" "), //split original text to array of words
arr2 = []; //miss matching words will be added here
//filter txt1 and txt2 from matching words and add miss matching to arr2///////
for (var i in arr1) {
var match = txt2.match(new RegExp("\\b" + arr1[i] + "\\b"));
if (match) {
txt2 = txt2.replace(new RegExp("\\s?" + arr1[i]), "");
txt1 = txt1.replace(new RegExp("\\s?" + arr1[i]), "");
} else if (!match) {
arr2.push(arr1[i]);
}
}
//compare miss matching words from original and submitted text, if matching charachters is more that 50% highlight missing and extra characters
var arr3 = txt2.split(" "), //convert filtered submitted text to words array
right = elm1.innerHTML,
wrong = elm2.value;
for (var a in arr2) {
for (var b in arr3) {
var match2 = arr3[b].match(new RegExp("[" + arr2[a] + "]", "g")),
t = (arr2[a].length > arr3[b].length) ? arr2[a].length : arr3[b].length;
if (match2 && match2.length >= t * 0.5) { //check for words that look similar
txt2 = txt2.replace(new RegExp("\\s?" + arr3[b]), "");
txt1 = txt1.replace(new RegExp("\\s?" + arr2[a]), "");
var str1 = "",
str2 = "",
n = 0;
for (var c = 0; c < t; c++) {
if (arr2[a].charAt(c) === arr3[b].charAt(c + n)) {
str1 += arr3[b].charAt(c + n);
str2 += arr2[a].charAt(c);
} else if (arr2[a].charAt(c) !== arr3[b].charAt(c + n)) {
if(arr2[a].charAt(c + 1) == arr3[b].charAt(c + n)){
str2 += arr2[a].charAt(c).fontcolor("blue");
str1 += "_".fontcolor("red");
n--;
}else if(arr2[a].charAt(c) == arr3[b].charAt(c + n + 1)){
str1 += arr3[b].charAt(c + n).fontcolor("orange");
n++;
c--;
}else{
str1 += arr3[b].charAt(c + n).fontcolor("red");
str2 += arr2[a].charAt(c).fontcolor("green");
}
}
}
wrong = wrong.replace(arr3[b], str1);
right = right.replace(arr2[a], str2);
}
}
}
//check for extra words//////////////////////////////////////
extra = txt2.split(" ");
for(var d in extra){
wrong = wrong.replace(extra[d], extra[d].fontcolor("grey"));
}
//check for missing words//////////////////////////////////////
missing = txt1.split(" ");
for(var f in missing){
right = right.replace(missing[f], missing[f].fontcolor("blue"));
}
output.innerHTML = wrong;
elm1.innerHTML = right;
}
DEMO
How It Works:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With