2015-08-03 26 views
-1

我想diff的2個文件,並忽略不PHP如何差異文件的單引號的文本在PHP

例如有單引號(「文本」)檢查線路: 文件1:

START 
    LTEXT "Tool Version:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT 
     EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT 

文件2:

/* 
* Translated by Saibamen 
* 
/

START  
    LTEXT "Wersja narzędzia:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT 
     EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT 

我要檢查是否有工具版本之間有什麼區別:和Wersjanarzędzia:字符串。

注意:文件沒有一行一行的相同模式 - 我想從文件中有START的行開始差異行。

+0

你有試過什麼嗎?如果是這樣,請將其包含在您的問題中 – Epodax

+0

您發佈的兩行都沒有開頭。你可以請澄清你的問題 – baao

+0

@Epodax:由stephenmorley.org差異類,但這個類使差異逐行,沒有選項來設置搜索文本來檢查(「一些文本」) – Saibamen

回答

1

您應該首先獲取每個文件的內容,然後使用preg_match函數以適當的模式查找版本行和版本字符串。

$fileContent1 = <<<TXT 
dummy 
dummy 
LTEXT "Tool Version:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT 


dummy 
TXT; 

$fileContent2 = <<<TXT 
dummy 
LTEXT "Wersja narzędzia:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT 
dummy 
dummy 

TXT; 

function diff_versions($leftContent, $rightContent) { 
    $diff = true; 
    $leftVersion = null; 
    $rightVersion = null; 

    $pattern = '/LTEXT "(Tool Version|Wersja narzędzia):", (.*)\R?/'; 

    if (preg_match($pattern, $leftContent, $matches) !== 1) { 
     throw new Exception('Left content has no version line.'); 
    } 

    $leftVersion = $matches[2]; 

    if (preg_match($pattern, $rightContent, $matches) !== 1) { 
     throw new Exception('Right content has no version line.'); 
    } 

    $rightVersion = $matches[2]; 

    return array(
     'diff' => $leftVersion === $rightVersion, 
     'leftVersion' => $leftVersion, 
     'rightVersion' => $rightVersion, 
    ); 
} 

var_dump(diff_versions($fileContent1, $fileContent2)); 


輸出:

array (size=3) 
    'diff' => boolean true 
    'leftVersion' => string 'IDC_STATIC, 70, 150, 80, 10, SS_RIGHT EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT' (length=89) 
    'rightVersion' => string 'IDC_STATIC, 70, 150, 80, 10, SS_RIGHT EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT' (length=89) 

然後只要你喜歡,你應該diff的版本。

+0

謝謝!一個問題。如何爲所有文件內容(for)多輸出?我使用file_get_contents(),並且只輸出第一個匹配項。我已將模式更改爲'$ pattern ='/(LTEXT | PUSHBUTTON | CAPTION | GROUPBOX | RTEXT)「(。*)」(。*)\ R?/';' – Saibamen

+1

如果您想查找,請使用'preg_match_all'並提取多個事件。 –

0

也許這會給出一個點入手:

$str1 = 'LTEXT "Tool Version:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT 
    EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT'; 

$str2 = 'LTEXT "Wersja narzędzia:", IDC_STATIC, 70, 150, 80, 10, SS_RIGHT 
    EDITTEXT IDC_STATIC_TIME, 155, 50, 210, 10, ES_LEFT'; 

$shortStr1 = substr($str1, 23); 
$shortStr2 = substr($str2, 28); 

echo "\n"; 
echo substr_compare($shortStr1, $shortStr2, 0, strlen($shortStr1)); 
echo "\n"; 
echo substr_compare($shortStr2, $shortStr1, 0, strlen($shortStr2)); 
  • 兩相比較,如果字符串不相同的大小
  • 將返回0,如果同一
  • 請問如果不相同返回1
  • 爲了更好的測試,你必須通過preg_match()測試和pre_match_all()

我認爲這個 - 或者至少是這個想法 - 會引導你找到答案。 下一次提供更多的信息和你已經嘗試過的,許多人甚至會提供完整的解決方案! 但是,你必須顯示你已經得到並已經嘗試過。沒有人願意做你付出的工作,但很多人願意幫助你,如果你有任何問題已經夠努力了!

+0

哦,看,在我寫這篇文章時,你已經有@Jan.J發佈的解決方案了! – Haudegen