diff --git a/extend/base/common/tools/PathToolsBase.php b/extend/base/common/tools/PathToolsBase.php index 8d7cd9b..4c9f004 100644 --- a/extend/base/common/tools/PathToolsBase.php +++ b/extend/base/common/tools/PathToolsBase.php @@ -132,55 +132,74 @@ class PathToolsBase $result = true; - // Check if filesize is different - if (filesize($a) !== filesize($b)) { - $result = false; - } + // 如果前面的方法认为文件变化,那么以文本变化的方式识别是否变化,并给出变化的内容 + $text_mime_type = []; + $text_mime_type[] = 'text/html'; + $text_mime_type[] = 'text/plain'; + $text_mime_type[] = 'text/css'; + $text_mime_type[] = 'image/svg+xml'; + $text_mime_type[] = 'text/x-php'; + $text_mime_type[] = 'application/json'; + $text_mime_type[] = 'application/x-wine-extension-ini'; - if ($result) { - // Check if content is different - $ah = fopen($a, 'rb'); - $bh = fopen($b, 'rb'); + if (in_array(mime_content_type($a), $text_mime_type) && in_array(mime_content_type($b), $text_mime_type)) { + $a_content = file_get_contents($a); + $b_content = file_get_contents($b); - while (!feof($ah)) { - if (fread($ah, 8192) != fread($bh, 8192)) { - $result = false; - break; + $a_content = str_replace("\r\n", "\n", $a_content); + $b_content = str_replace("\r\n", "\n", $b_content); + + // 将空格和制表符转换为一个空格 + $a_content = preg_replace('/[ \t]+/', ' ', $a_content); + $b_content = preg_replace('/[ \t]+/', ' ', $b_content); + + $a_content_arr = mb_str_split($a_content); + $b_content_arr = mb_str_split($b_content); + + $a_content_length = count($a_content_arr); + + $diff_content = []; + for ($i = 0; $i < $a_content_length; $i++) { + $diff_char = []; + $diff_char['path_a'] = $a; + $diff_char['path_b'] = $b; + $diff_char['index'] = $i; + if (isset($b_content_arr[$i])) { + if ($a_content_arr[$i] !== $b_content_arr[$i]) { + $diff_char['a'] = $a_content_arr[$i]; + $diff_char['b'] = $b_content_arr[$i]; + $diff_content[] = $diff_char; + } + } else { + $diff_char['a'] = $a_content_arr[$i]; + $diff_char['b'] = ''; + $diff_content[] = $diff_char; } } - fclose($ah); - fclose($bh); - } + if (count($diff_content) > 0) { + $result = false; + } + } else { + // Check if filesize is different + if (filesize($a) !== filesize($b)) { + $result = false; + } - if (!$result) { - // 如果前面的方法认为文件变化,那么以文本变化的方式识别是否变化,并给出变化的内容 - $text_mime_type = []; - $text_mime_type[] = 'text/html'; - $text_mime_type[] = 'text/plain'; - $text_mime_type[] = 'text/css'; - $text_mime_type[] = 'image/svg+xml'; - $text_mime_type[] = 'text/x-php'; - $text_mime_type[] = 'application/json'; - $text_mime_type[] = 'application/x-wine-extension-ini'; + if ($result) { + // Check if content is different + $ah = fopen($a, 'rb'); + $bh = fopen($b, 'rb'); - if (in_array(mime_content_type($a), $text_mime_type) && in_array(mime_content_type($b), $text_mime_type)) { - $a_content = file_get_contents($a); - $b_content = file_get_contents($b); - - $a_content_length = strlen($a_content); - $b_content_length = strlen($b_content); - - if ($a_content_length !== $b_content_length) { - $result = false; - } else { - for ($i = 0; $i < $a_content_length; $i++) { - if ($a_content[$i] !== $b_content[$i]) { - $result = false; - break; - } + while (!feof($ah)) { + if (fread($ah, 8192) != fread($bh, 8192)) { + $result = false; + break; } } + + fclose($ah); + fclose($bh); } }