解析文件中的内容

时间:2013-03-08 03:05:00

标签: php regex preg-match preg-match-all

我正在尝试使用以下内容解析文件并将其显示在表格中。问题是我只能获得第一个租赁节。我不确定如何获得其他人?有什么想法吗?

INPUT:

# The format of this file is documented in the dhcpd.leases manual page.
# This lease file was written by isc-dhcp-V3.0.3b1

lease 192.168.98.25 {
  starts 5 2012/10/05 21:18:41;
  ends 5 2012/10/05 22:48:15;
  tstp 5 2012/10/05 22:18:41;
  binding state free;
  hardware ethernet 78:d6:f0:c1:7f:b5;
  uid "\001x\326\360\301\177\265";
}
lease 192.168.10.1 {
  starts 5 2012/10/04 12:23:23;
  ends 5 2012/10/05 22:48:15;
  binding state active;
  next binding state free;
  hardware ethernet 56:a3:f0:d1:75:b5;
  uid "\001x\326\360\301\177\265";
}
....
....

输出:

 HW Address  |start time  | end time | IP 
 78:d6:f0:c1:7f:b5 | 2012/10/05 21:18:41 | 2012/10/05 22:48:15 | 192.168.98.25
 56:a3:f0:d1:75:b5 | 2012/10/04 12:23:23 | 2012/10/05 22:48:15 | 192.168.10.1

这是我到目前为止所尝试的:

$readfile = file('/etc/dhcp/dhcpd.leases',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$arstring = implode(" ",$readfile);

$regex=array();
preg_match_all("(lease\s*([0-9.]+)\s*{\s*starts\s*.?\s*([0-9/\s:]*).?\s*ends\s*.?\s*([0-9/\s:]*).*ethernet\s*([\w:]*))", $arstring, $regex,PREG_SET_ORDER);

这给了我:

[0] => Array
    (
        [0] => lease 192.168.98.25 {   starts 5 2012/10/05 21:18:41;   ends 5 2012/10/05 22:18:41;   tstp 5 2012/10/05 22:18:41;   binding state free;   hardware ethernet 78:d6:f0:c1:7f:b5;   uid "\001x\326\360\301\177\265"; } lease 192.168.98.25 {   starts 5 2012/10/05 22:54:15;   ends 5 2012/10/05 23:54:15;   binding state active;   next binding state free;   hardware ethernet 78:d6:f0:c1:7f:b5;   uid "\001x\326\360\301\177\265"; } lease 192.168.98.25 {   starts 5 2012/10/05 22:54:16;   ends 5 2012/10/05 23:54:16;   binding state active;   next binding state free;   hardware ethernet 78:d6:f0:c1:7f:b5
        [1] => 192.168.98.25
        [2] => 2012/10/05 21:18:41
        [3] => 2012/10/05 22:18:41
        [4] => 78:d6:f0:c1:7f:b5
    )

2 个答案:

答案 0 :(得分:0)

我不太熟悉PHP所以我不能给你确切的代码,但如果你把它变成一个替换然后在一个循环中执行它,用一个空格代替匹配的部分直到没有任何东西留给匹配,这可能会成功。

答案 1 :(得分:0)

我最终发现的问题是,我没有逃脱。和/修饰符。

这是我正在使用的正则表达式:

$reg_str = '/(lease\s*([0-9\.]+)\s*{\s*starts\s*.?\s*([0-9\/\s:]*).?\s*ends\s*.?\s*([0-9\/:\s\w]*);[\r\n\s\w;]*ethernet\s*([\w:]*);?[\w\s\\\"0-9\s\r]*;?\s*[\w\-]*\s*"?([\w-]*)"?;?\s*})/ims';
preg_match_all($reg_str, $arstring, $leases, PREG_SET_ORDER);

谢谢大家的帮助。