2016-07-04 15 views
0

使用するPHP 2つのテキストファイルを比較したいと思います。最初のファイルは、もう1つのファイルと比較する必要があるメインファイルです。 first.txtのラインがsecond.txtに存在する又はそれと異なっているしない場合、スクリプトは、例えば、その行のブロック全体を返すべきである:正規表現を使用してテキストブロックを抽出する

interface Vlan11 description xxx ip address 10.10.10.10 255.255.255.255 shutdown ! vlan 34 ! vlan 17 name sth ! route-map sth match ip address exm set ip next-hop 1.2.3.4 ! 

first.txt。私はを使用first.txt行を抽出し比較するためにTXT

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 
vlan 34 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 

かで:とsecond.txtでそれらを検索するには、今IPアドレスはsecond.txtの3行目では異なっている、そして我々は(バン(!)へinterfaceから)このラインのブロックを返す必要がありますvlanブロックのsecond.txt 1は存在しないので、リターンをすべき:

vlan 17 
name sth 
! 

これは、2つの前髪の間のブロックを抽出し、正規表現を書くのは簡単だが、私は「ドンブロックの先頭に戻る必要がありますので、どのようなパターンが起きるべきか知っているh。

また、すべてのブロックが文字で始まり、最後にスペースで開始し、次に終わりで始まるいくつかの行がありますが、問題はパターンの開始方法です。

+0

あなたが望む通りに「diff」しないでしょうか? – Jan

+0

ブロックは2つのファイルで同じ順序になっていますか? –

+0

これは 'diff'ですか? @Jan –

答えて

0

あなたはブロックを一致させるために、次の正規表現を使用することができます。

/.*?\R!\R*/s 

\Rは改行にマッチし、s修飾子は.も改行と一致することを確認します。

あなたは、テキストからすべてのブロックを取得し、比較を行うと異なっているブロックを抽出するためにarray_diffを使用するpreg_match_allを使用することができます。

$text1 = file_get_contents("first.txt"); 
$text2 = file_get_contents("second.txt"); 

preg_match_all('/.*?\R!\R*/s', $text1, $blocks1); 
preg_match_all('/.*?\R!\R*/s', $text2, $blocks2); 

$result = array_diff($blocks1[0], $blocks2[0]); 

print_r($result); 

は、それがeval.in上で実行を参照してください。

0

これは、 '!'で区切られた2つのファイルの共通部分と固有部分を見つける方法の1つです。

<?php 

$first_txt = "interface Vlan11 
description xxx 
ip address 10.10.10.10 255.255.255.255 
shutdown 
! 
vlan 34 
! 
vlan 17 
name sth 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 
"; 


$second_txt = "interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 
vlan 34 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 
"; 

$first_parts=explode('!',$first_txt); 
$second_parts=explode('!',$second_txt); 

print_r($first_parts); 
print_r($second_parts); 

foreach ($first_parts as $part) 
{ 
    if (in_array($part, $second_parts)) 
    { 
     echo "found in second_parts $part"; 
     echo ""; 
    } 
    else 
    { 
     echo "not found in second_parts $part"; 
     echo ""; 
    } 
} 
foreach ($second_parts as $part) 
{ 
    if (in_array($part, $first_parts)) 
    { 
     echo "found in first_parts $part"; 
     echo ""; 
    } 
    else 
    { 
     echo "not found in first_parts $part"; 
     echo ""; 
    } 
} 
関連する問題