-1

我有 PHP 4 代码来检查两个文件的差异,这在具有 PHP 4 版本的旧服务器上运行良好,但在新服务器上我遇到了错误。例如:

$maxlen没有定义

并且功能在新服务器上不起作用。任何人都知道如何为最近的 PHP 版本更改这个?

 function diff($old, $new){ 
            foreach($old as $oindex => $ovalue){ 
                    $nkeys = array_keys($new, $ovalue); 
                    foreach($nkeys as $nindex){ 
                            $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? 
                                    $matrix[$oindex - 1][$nindex - 1] + 1 : 1; 
                            if($matrix[$oindex][$nindex] > $maxlen){ 
                                    $maxlen = $matrix[$oindex][$nindex]; 
                                    $omax = $oindex + 1 - $maxlen; 
                                    $nmax = $nindex + 1 - $maxlen; 
                            } 
                    }        
            } 
            if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new)); 
            return array_merge( 
                    diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), 
                    array_slice($new, $nmax, $maxlen), 
                    diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); 
    } 

    function htmlDiff($old, $new){ 
    $preg="/[\s,]+/";
        $old=str_replace(">","> ",$old);
        $new=str_replace(">","> ",$new);
        $old=str_replace("<"," <",$old);
        $new=str_replace("<"," <",$new);

        $diff = diff(preg_split($preg, $old),preg_split($preg, $new)); 
        foreach($diff as $k){ 
        if(is_array($k)) 
            $ret .= (!empty($k['d'])?"<div style='BACKGROUND-COLOR: red'>".implode(' ',$k['d'])."</div> ":''). 
            (!empty($k['i'])?"<div style='BACKGROUND-COLOR: yellow'>".implode(' ',$k['i'])."</div> ":''); 
            else $ret .= $k . ' '; 
        } 
        return $ret; 
    } 
    function creatediff($oldurl,$newurl,$diffurl){ 
        $sold= file_get_contents($oldurl);
        $snew= file_get_contents($newurl);
        $diff=htmlDiff($sold,$snew);
        $diff=preg_replace('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#','$1="'.$newurl.'/$2"',$diff);
        file_put_contents($diffurl,$diff);
    }
4

2 回答 2

1

这不是由于版本差异,而是错误的代码。您可能已经error_reporting关闭/关闭了之前的安装,这可能是您没有看到它的原因。回到您的 PHP4 环境,设置error_reportingE_ALL,您可能会看到大部分相同的警告。

因为仅在满足一个特定条件$maxlen时才定义,因此在其他情况下永远不会定义并生成警告。if您可以通过$maxlen在函数顶部定义或isset()在尝试引用变量之前使用来避免这种情况。

于 2013-03-06T18:20:02.307 回答
1

您的循环包含:

if($matrix[$oindex][$nindex] > $maxlen)

但是第一次通过循环,$maxlen没有设置任何东西,所以这个比较会产生一个警告(不是错误)。

您应该$maxlen在循环之前进行初始化,或者将其更改为:

if (!isset($maxlen) || $matrix[$oindex][$nindex] > $maxlen)

另一个问题是函数中没有$matrix数组。如果这是一个全局变量,您需要:

global $matrix;

在函数的开头。

于 2013-03-06T18:20:22.333 回答