복붙노트

PHP에서 두 문자열 간의 차이점 강조하기

PHP

PHP에서 두 문자열 간의 차이점 강조하기

PHP에서 두 문자열의 차이를 강조하는 가장 쉬운 방법은 무엇입니까?

스택 오버플로 편집 내역 페이지의 라인을 따라 생각하고 있는데, 여기서 새 텍스트는 녹색이고 제거 된 텍스트는 빨간색입니다. 사전에 작성된 기능이나 수업이있는 경우 이상적입니다.

해결법

  1. ==============================

    1.PHP Horde_Text_Diff 패키지를 사용할 수 있습니다. 그것은 귀하의 요구에 적합하며, 또한 꽤 사용자 정의 할 수 있습니다.

    PHP Horde_Text_Diff 패키지를 사용할 수 있습니다. 그것은 귀하의 요구에 적합하며, 또한 꽤 사용자 정의 할 수 있습니다.

    GPL 라이센스도 있으므로 즐기십시오!

  2. ==============================

    2.한 문자열을 다른 문자열로 변환하기 위해 가장 작은 (문자 그대로 취하지 않아야하는) 편집 횟수를 계산하는 클래스를 작성했습니다.

    한 문자열을 다른 문자열로 변환하기 위해 가장 작은 (문자 그대로 취하지 않아야하는) 편집 횟수를 계산하는 클래스를 작성했습니다.

    http://www.raymondhill.net/finediff/

    diff의 HTML 버전을 렌더링하는 정적 함수가 있습니다.

    그것은 첫 번째 버전이며 개선 될 가능성이 있지만, 지금은 잘 작동하기 때문에 필자는 필자가 필요로하는 것처럼 compact diff를 효율적으로 생성해야 할 경우를 대비하여이를 던지고 있습니다.

    편집 : 이제 Github에 있습니다 : https://github.com/gorhill/PHP-FineDiff

  3. ==============================

    3.강력한 라이브러리를 원한다면, Text_Diff (PEAR 패키지)가 꽤 좋은 것처럼 보입니다. 그것은 꽤 멋진 기능을 가지고 있습니다.

    강력한 라이브러리를 원한다면, Text_Diff (PEAR 패키지)가 꽤 좋은 것처럼 보입니다. 그것은 꽤 멋진 기능을 가지고 있습니다.

  4. ==============================

    4.이것도 좋은 것입니다. http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

    이것도 좋은 것입니다. http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

  5. ==============================

    5.다음은 두 개의 배열을 비교하는 데 사용할 수있는 짧은 함수입니다. 그것은 LCS 알고리즘을 구현합니다 :

    다음은 두 개의 배열을 비교하는 데 사용할 수있는 짧은 함수입니다. 그것은 LCS 알고리즘을 구현합니다 :

    function computeDiff($from, $to)
    {
        $diffValues = array();
        $diffMask = array();
    
        $dm = array();
        $n1 = count($from);
        $n2 = count($to);
    
        for ($j = -1; $j < $n2; $j++) $dm[-1][$j] = 0;
        for ($i = -1; $i < $n1; $i++) $dm[$i][-1] = 0;
        for ($i = 0; $i < $n1; $i++)
        {
            for ($j = 0; $j < $n2; $j++)
            {
                if ($from[$i] == $to[$j])
                {
                    $ad = $dm[$i - 1][$j - 1];
                    $dm[$i][$j] = $ad + 1;
                }
                else
                {
                    $a1 = $dm[$i - 1][$j];
                    $a2 = $dm[$i][$j - 1];
                    $dm[$i][$j] = max($a1, $a2);
                }
            }
        }
    
        $i = $n1 - 1;
        $j = $n2 - 1;
        while (($i > -1) || ($j > -1))
        {
            if ($j > -1)
            {
                if ($dm[$i][$j - 1] == $dm[$i][$j])
                {
                    $diffValues[] = $to[$j];
                    $diffMask[] = 1;
                    $j--;  
                    continue;              
                }
            }
            if ($i > -1)
            {
                if ($dm[$i - 1][$j] == $dm[$i][$j])
                {
                    $diffValues[] = $from[$i];
                    $diffMask[] = -1;
                    $i--;
                    continue;              
                }
            }
            {
                $diffValues[] = $from[$i];
                $diffMask[] = 0;
                $i--;
                $j--;
            }
        }    
    
        $diffValues = array_reverse($diffValues);
        $diffMask = array_reverse($diffMask);
    
        return array('values' => $diffValues, 'mask' => $diffMask);
    }
    

    두 개의 배열을 생성합니다 :

    배열에 문자를 채우면 인라인 차이를 계산하는 데 사용할 수 있습니다. 차이점을 강조하기위한 한 단계.

    function diffline($line1, $line2)
    {
        $diff = computeDiff(str_split($line1), str_split($line2));
        $diffval = $diff['values'];
        $diffmask = $diff['mask'];
    
        $n = count($diffval);
        $pmc = 0;
        $result = '';
        for ($i = 0; $i < $n; $i++)
        {
            $mc = $diffmask[$i];
            if ($mc != $pmc)
            {
                switch ($pmc)
                {
                    case -1: $result .= '</del>'; break;
                    case 1: $result .= '</ins>'; break;
                }
                switch ($mc)
                {
                    case -1: $result .= '<del>'; break;
                    case 1: $result .= '<ins>'; break;
                }
            }
            $result .= $diffval[$i];
    
            $pmc = $mc;
        }
        switch ($pmc)
        {
            case -1: $result .= '</del>'; break;
            case 1: $result .= '</ins>'; break;
        }
    
        return $result;
    }
    

    예 :

    echo diffline('StackOverflow', 'ServerFault')
    

    출력 :

    S<del>tackO</del><ins>er</ins>ver<del>f</del><ins>Fau</ins>l<del>ow</del><ins>t</ins> 
    

    StackOerverfFaulowt

    추가 참고 사항 :

  6. ==============================

    6.xdiff에 대한 PECL 확장도 있습니다.

    xdiff에 대한 PECL 확장도 있습니다.

    특히:

    PHP 매뉴얼의 예제 :

    <?php
    $old_article = file_get_contents('./old_article.txt');
    $new_article = $_POST['article'];
    
    $diff = xdiff_string_diff($old_article, $new_article, 1);
    if (is_string($diff)) {
        echo "Differences between two articles:\n";
        echo $diff;
    }
    
  7. ==============================

    7.이게 내가 찾은 최고의거야.

    이게 내가 찾은 최고의거야.

    http://code.stephenmorley.org/php/diff-implementation/

  8. ==============================

    8.당신이 찾고있는 것은 "diff 알고리즘"입니다. 빠른 google 검색을 통해이 솔루션을 얻을 수있었습니다. 나는 그것을 테스트하지 않았지만, 아마도 당신이 필요로하는 것을 할 것입니다.

    당신이 찾고있는 것은 "diff 알고리즘"입니다. 빠른 google 검색을 통해이 솔루션을 얻을 수있었습니다. 나는 그것을 테스트하지 않았지만, 아마도 당신이 필요로하는 것을 할 것입니다.

  9. ==============================

    9.나는 PEAR 기반의 간단한 대안과 함께 보이는 두 가지 끔찍한 문제가있었습니다. 그래서 여기에 Unix diff 명령을 사용하는 솔루션이 있습니다 (분명히 Unix 시스템에 있어야하거나 제대로 작동하려면 Windows diff 명령이 있어야합니다). 선호하는 임시 디렉토리를 선택하고 원하는 경우 코드를 반환하도록 예외를 변경하십시오.

    나는 PEAR 기반의 간단한 대안과 함께 보이는 두 가지 끔찍한 문제가있었습니다. 그래서 여기에 Unix diff 명령을 사용하는 솔루션이 있습니다 (분명히 Unix 시스템에 있어야하거나 제대로 작동하려면 Windows diff 명령이 있어야합니다). 선호하는 임시 디렉토리를 선택하고 원하는 경우 코드를 반환하도록 예외를 변경하십시오.

    /**
     * @brief Find the difference between two strings, lines assumed to be separated by "\n|
     * @param $new string The new string
     * @param $old string The old string
     * @return string Human-readable output as produced by the Unix diff command,
     * or "No changes" if the strings are the same.
     * @throws Exception
     */
    public static function diff($new, $old) {
      $tempdir = '/var/somewhere/tmp'; // Your favourite temporary directory
      $oldfile = tempnam($tempdir,'OLD');
      $newfile = tempnam($tempdir,'NEW');
      if (!@file_put_contents($oldfile,$old)) {
        throw new Exception('diff failed to write temporary file: ' . 
             print_r(error_get_last(),true));
      }
      if (!@file_put_contents($newfile,$new)) {
        throw new Exception('diff failed to write temporary file: ' . 
             print_r(error_get_last(),true));
      }
      $answer = array();
      $cmd = "diff $newfile $oldfile";
      exec($cmd, $answer, $retcode);
      unlink($newfile);
      unlink($oldfile);
      if ($retcode != 1) {
        throw new Exception('diff failed with return code ' . $retcode);
      }
      if (empty($answer)) {
        return 'No changes';
      } else {
        return implode("\n", $answer);
      }
    }
    
  10. ==============================

    10.Neil Frasers의 PHP 포트 diff_match_patch (Apache 2.0 라이센스)

    Neil Frasers의 PHP 포트 diff_match_patch (Apache 2.0 라이센스)

  11. ==============================

    11.PHP 코어에서 다음과 같은 멋진 기능을 살펴 보는 것이 좋습니다.

    PHP 코어에서 다음과 같은 멋진 기능을 살펴 보는 것이 좋습니다.

    similar_text - 두 문자열 간의 유사성 계산

    http://www.php.net/manual/en/function.similar-text.php

    levenshtein - 두 문자열 사이의 Levenshtein 거리를 계산합니다.

    http://www.php.net/manual/en/function.levenshtein.php

    soundex - 문자열의 soundex 키 계산

    http://www.php.net/manual/en/function.soundex.php

    metaphone - 문자열의 메타 폰 키 계산

    http://www.php.net/manual/en/function.metaphone.php

  12. ==============================

    12.좋은 솔루션이 될 수있는 Python difflib을 기반으로 Chris Boulton에 의해이 PHP diff 클래스를 보았습니다.

    좋은 솔루션이 될 수있는 Python difflib을 기반으로 Chris Boulton에 의해이 PHP diff 클래스를 보았습니다.

    PHP Diff Library

  13. from https://stackoverflow.com/questions/321294/highlight-the-difference-between-two-strings-in-php by cc-by-sa and MIT license