Ответ 1
Ваш код будет работать только в том случае, если две строки имеют одинаковую длину и одну и ту же компоновку слов, иначе она сломается, т.е. если вы добавите дополнительный символ в начале тестируемой строки.
после некоторого кодирования мне удалось найти код ниже, он сравнивает две строки и находит отсутствующие символы/слова, дополнительные символы/слова и неправильное написание:
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;
}
Как это работает:
- Сравните оригинальные и представленные тексты и найдите соответствующие слова и удалите их.
- Сравните оставшиеся слова из обеих строк
- Если два слова выглядят одинаково (равные символы = > 50% от общего числа символов)
- проверьте отсутствие/лишние/символы с ошибками и выделите их.
- Удалить слова с ошибками из обеих строк
- Выделите оставшиеся слова в исходном тексте как отсутствующие слова
- Выделите оставшиеся слова в представленном тексте как дополнительные слова