2016-07-04 7 views
0

Использование PHP Я хочу сравнить два текстовых файла, первый файл является основным, который должен сравнить с другим. Если линия first.txt не существует в second.txt или отличается от него, сценарий должен возвращать весь блок этой строки, например:Извлечь блок текста с использованием regex

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 
! 

второй. 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.txt линии, используя file() и искать их в second.txt, теперь IP адрес отличается в третьей строке second.txt, то мы должны вернуть блок этой линии (от interface до взрыва (!)):

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 

или в second.txt один из vlan блоков не существует, поэтому она должна возвращается:

vlan 17 
name sth 
! 

это легко написать регулярное выражение, которое извлекает блок между двумя ударами, а потому, что я должен вернуться к началу блока I DON» Знать, какой шаблон должен начинаться с ума час

Также у меня есть другая идея, что каждый блок начинается с символа, затем некоторые строки, начинающиеся с пробела, а затем в конце, но проблема заключается в том, как запустить шаблон.

+0

Не будет 'diff' делать именно то, что вы хотите? – Jan

+0

Блоки должны быть в том же порядке в двух файлах? –

+0

который 'diff'? @Jan –

ответ

0

Вы можете использовать следующее регулярное выражение для соответствия блоков:

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

The \R Удачных перевод строки, а модификатор s убеждается, что . также будет соответствовать новой строке.

Вы могли бы использовать preg_match_all, чтобы получить все блоки из текста, а также использовать array_diff, чтобы сделать сравнение и извлечь блоки, которые отличаются:

$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

Это один из способов найти общие и уникальные части двух файлов, разделенных символом «!».

<?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 ""; 
    } 
} 
Смежные вопросы