3

我正在尝试解析具有以下内容的文件并将其显示在表格中。问题是我只能得到第一个租约节。我不知道如何获得其余的?有任何想法吗?

输入:

# 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
    )
4

2 回答 2

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);

谢谢大家的帮助。

于 2013-03-11T16:31:36.397 回答
0

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

于 2013-03-08T04:10:36.557 回答