За последние 24 часа нас посетили 9033 программиста и 439 роботов. Сейчас ищут 129 программистов ...

diff_format

Тема в разделе "Решения, алгоритмы", создана пользователем Sergey89, 18 фев 2009.

  1. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Функция форматирует вывод утилиты diff

    PHP:
    1. <?php
    2. function diff_format($left_filename, $right_filename) {
    3.     $file_left  = file($left_filename, FILE_IGNORE_NEW_LINES);
    4.     $file_right = file($right_filename, FILE_IGNORE_NEW_LINES);
    5.  
    6.     array_unshift($file_left, '');
    7.     array_unshift($file_right, '');
    8.  
    9.     $exec_exp = 'diff "' . $left_filename . '" "' . $right_filename . '"';
    10.     exec($exec_exp, $output);
    11.  
    12.     $result = '';
    13.     $cur_line = 1;
    14.  
    15.     foreach ($output as $line) {
    16.         if (preg_match('/^([\d,]+)([adc])([\d,]+)/', $line, $match)) {
    17.             $command = $match[2]; // a - add, c - change, d - delete
    18.             $lines_left  = explode(',', $match[1]);
    19.             $lines_right = explode(',', $match[3]);
    20.  
    21.             if (!isset($lines_left[1])) {
    22.                 $lines_left[1] = $lines_left[0];
    23.             }
    24.  
    25.             if (!isset($lines_right[1])) {
    26.                 $lines_right[1] = $lines_right[0];
    27.             }
    28.  
    29.             $result .= '<div class="diffn">';
    30.  
    31.             for ($i = $cur_line; $i < $lines_left[0]; $i++) {
    32.                 $result .= htmlspecialchars($file_left[$i]) . '<br />';
    33.             }
    34.  
    35.             $result .= '</div>';
    36.  
    37.             switch ($command) {
    38.                 case 'a': {
    39.                     $result .= '<div class="diffa">';
    40.  
    41.                     for ($i = $lines_right[0]; $i <= $lines_right[1]; $i++) {
    42.                         $result  .= htmlspecialchars($file_right[$i]) . '<br />';
    43.                     }
    44.  
    45.                     $result .= '</div>';
    46.                 }
    47.                 break;
    48.                 case 'c': {
    49.                     $result .= '<div class="diffd">';
    50.  
    51.                     for ($i = $lines_left[0]; $i <= $lines_left[1]; $i++) {
    52.                         $result .= htmlspecialchars($file_left[$i]) . '<br />';
    53.                     }
    54.  
    55.                     $result .= '</div>';
    56.                     $result .= '<div class="diffc">';
    57.  
    58.                     for ($i = $lines_right[0]; $i <= $lines_right[1]; $i++) {
    59.                         $result .= htmlspecialchars($file_right[$i]) . '<br />';
    60.                     }
    61.  
    62.                     $result .= '</div>';
    63.                 }
    64.                 break;
    65.                 case 'd': {
    66.                     $result .= '<div class="diffd">';
    67.  
    68.                     for ($i = $lines_left[0]; $i <= $lines_left[1]; $i++) {
    69.                         $result .= htmlspecialchars($file_left[$i]) . '<br />';
    70.                     }
    71.  
    72.                     $result .= '</div>';
    73.                 }
    74.                 break;
    75.             }
    76.  
    77.             $cur_line = $lines_left[1] + 1;
    78.         }
    79.     }
    80.  
    81.     $lines_count = count($file_left);
    82.     $result .= '<div class="diffn">';
    83.  
    84.     for ($i = $cur_line; $i < $lines_count; $i++) {
    85.         $result .= htmlspecialchars($file_left[$i]) . '<br />';
    86.     }
    87.  
    88.     $result .= '</div>';
    89.     $result = str_replace("\t", '    ', $result);
    90.  
    91.     return str_replace('  ', '&nbsp; ', $result);
    92. }
    93.  
    PHP:
    1. print diff_format('1.txt', '2.txt');
    Посмотреть тут http://codepaste.ru/diff/?new=1612&old=1611

    Форум сожрал & nbsp;, в конце так
    PHP:
    1. return str_replace('  ', '& nbsp; ', $result);
    без пробела между & и nbsp;