使用正则表达式

时间:2016-07-04 12:25:18

标签: php regex

使用PHP我想比较两个文本文件,第一个文件是另一个应该与之比较的主文件。 如果first.txt中的second.txt行不存在或与其不同,则脚本应返回该行的整个块,例如:

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.txt提取file()行并在second.txt中搜索它们,现在second.txt的第三行的IP地址不同,然后我们应该返回此行的块(从interface到爆炸(!)):

interface Vlan11
 description xxx
 ip address 20.20.20.20 255.255.255.255
 shutdown
!

second.txtvlan块之一不存在,因此应返回:

vlan 17
 name sth
!

很容易编写一个正则表达式来提取两个刘海之间的块,但是因为我应该回到块的开头,我不知道该模式应该从哪个开始。

另外我还有另外一个想法,即每个块都以一个字符开头,然后是一些以空格开头然后在一端开始爆炸的行,但问题在于如何启动模式。

2 个答案:

答案 0 :(得分: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 "";
    }
}

答案 1 :(得分:0)

您可以使用以下正则表达式来匹配块:

[Service]
Environment="SECRET_KEY=secret-key-string"

/.*?\R!\R*/s 匹配换行符,而\R修饰符可确保s也匹配换行符。

然后,您可以使用.从文本中获取所有块,并使用preg_match_all进行比较并提取不同的块:

array_diff

查看它在eval.in;

上运行