我有一段文章.
需要在修改后比对修改前后的不同.
并把差异显示出来.
这个好难.
我基础不好写不出来.
想过穷举==方式.
都没有办法能精确的定位.
比如文章第一句 剪切到文章最后就没办法分辨.
希望各位大大能帮忙.不限语言.如果不明白我所说的意思.给大家看一个网页就知道我要的是什么效果了.
http://zh.wikipedia.org/w/index.php?title=%E5%A4%A7%E7%88%86%E7%82%B8&action=edit&section=3
修改后点击 <<显示差异>>

解决方案 »

  1.   

    function TextDiff($old, $new) {
    $mode = true;
    if(! is_array($old)) {
    $bodyA = explode("\n", $old);
    $bodyB = explode("\n", $new);
    $mode = false;
    }else {
    $bodyA = $old;
    $bodyB = $new;
    } $result['added'] = array_diff_assoc($bodyA, $bodyB);
    $result['deleted'] = array_diff_assoc($bodyB, $bodyA);
    if($mode)
    return $result;
    if(count($result['added']) >= count($result['deleted']))
    $ar = $result['added'];
    else
    $ar = $result['deleted'];
    $retval = '';
    foreach($ar as $k=>$v) {
    $added = isset($result['added'][$k]) ? $result['added'][$k] : "";
    $deleted = isset($result['deleted'][$k]) ? $result['deleted'][$k] : "";
    preg_match_all("/[\x81-\xfe]?./",$added,$a1); preg_match_all("/[\x81-\xfe]?./",$deleted,$b1);
    $p = TextDiff($b1[0],$a1[0]);
    foreach($p['added'] as $key=>$value){
    $b1[0][$key] = "<font color=lime>$value</font>";
    }
    $deleted = join("",$b1[0]);
    foreach($p['deleted'] as $key=>$value){
    $a1[0][$key] = "<s><font color=red>$value</font></s>";
    }
    $added = join("",$a1[0]);
    $retval .= "<br><br>第".($k+1)."行";
    $retval .= "<br>[原文]$added";
    $retval .= "<br>[新文]$deleted";
    }
    return $retval;
    }本函数适用于 GBK 编码,如是 utf-8 编码请将 "/[\x81-\xfe]?./" 改为 "/./u"