<div id="txt1" style="border:1px solid black">Hello123 World 123</div>
<div id="txt2" style="border:1px solid black">Hello World 456</div>
<div id="txt3" style="border:1px solid red"></div>
<div id="txt4" style="border:1px solid red"></div>
<script type="text/javascript">
<!--
function compare_str(str1,str2)...{
var res1 = "";
var res2 = "";

while(str1.length && str2.length)...{
var arr = find_pos(str1,str2);
if (arr && arr.length)
...{
if (arr[0])
...{
res2 +=("<font color='green'>" + str2.substr(0,arr[0]) + "</font>");
str2 = str2.substr(arr[0]);
}
res1 +=(str1.substr(0,arr[1]));
res2 +=(str2.substr(0,arr[1])); 
str1 = str1.substr(arr[1]);
str2 = str2.substr(arr[1]);

}else...{
arr = find_max_pos(str1,str2);
tmp = find_match_pos(str1,str2);
if (tmp.length)
...{
if (arr[0]>tmp[0] && arr[1]>tmp[1])
...{
arr = tmp;
}
}
if (arr!=undefined && arr.length)
...{
res1 +=("<font color='red'>" + str1.substr(0,arr[0]) + "</font>");
res2 +=("<font color='red'>" + str2.substr(0,arr[1]) + "</font>");
res1 +=(str1.substr(arr[0],arr[2]));
res2 +=(str2.substr(arr[1],arr[2]));
str1 = str1.substr(arr[0]+arr[2]);
str2 = str2.substr(arr[1]+arr[2]);
}else...{
res1 +=("<font color='blue'>" + str1 + "</font>");
res2 +=("<font color='green'>" + str2 + "</font>");
str1 = '';
str2 = '';
}
}
}
if (str1.length)
...{
res1 +=("<font color='blue'>" + str1 + "</font>");
}
if (str2.length)
...{
res2 +=("<font color='green'>" + str2 + "</font>");
}

document.getElementById("txt3").innerHTML = (res1);
document.getElementById("txt4").innerHTML = (res2);
}
//从串2查找对串1前N个字符的最大匹配
function find_pos(str1,str2)...{
var len = 1, pos = 0;
var ret;

while (pos>=0)...{ //在str2中找不到字符时返回-1退出循环
var str = str1.substr(0,len);
pos = str2.indexOf(str);
if (pos!=-1)
...{
ret = [];
ret.push(pos,len); //将匹配开始的位置和匹配长度压入数组
len++; //增加一个匹配长度
if (len>str1.length)...{ //匹配长度大于str1长度时退出
break;
}

}else...{
break;
}
}
return ret;
}
//从串2查找对串1从第N个字符开始前N个字符的首次匹配
function find_match_pos(str1,str2,arr)...{
var len =1 , pos1 = 0, pos2 = 0, _pos2;
var ffind = false;
var ret = [];
if (arr!=undefined)
...{
pos1 = arr[0];pos2 = arr[1];
}
while((pos1+len)<str1.length)...{
var str = str1.substr(pos1,len);
_pos2 = str2.indexOf(str);
if (_pos2!=-1)
...{
ffind = true;len++;pos2 = _pos2;
}else...{
if (ffind)
...{
len--;break;
}else...{
pos1 += len;len = 1;
}
}
}
if (ffind)
...{
ret.push(pos1,pos2,len);
}else...{
ret = [];
}
return ret;
}
//查找下一个最适匹配
function find_next_pos(str1,str2)...{
}
//查找两个字串的字符数目最大匹配
function find_max_pos(str1,str2)...{
var ret,pos1,pos2,arr=null;
var res, max = 0;
do
...{
ret = find_match_pos(str1,str2,arr);
if (ret.length)
...{
if (ret[2]>max)
...{
res = ret;
max = ret[2];
}
arr = new Array(ret[0]+1,ret[1]);
}
}
while (ret.length);
return res;
}

function test()...{
var str1 = document.getElementById("txt1").innerText;
var str2 = document.getElementById("txt2").innerText;
compare_str(str1,str2);
}

test();
//-->
</script>
该博客展示了一个JavaScript算法,用于比较和高亮显示两个文本字符串的相似部分。通过find_pos、find_match_pos和find_max_pos等函数,实现了寻找最长匹配子串并用不同颜色标识相同和不同部分的功能。
239

被折叠的 条评论
为什么被折叠?



