我正在尝试使用以下内容解析文件并将其显示在表格中。问题是我只能获得第一个租赁节。我不确定如何获得其他人?有什么想法吗?
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
)
答案 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);
谢谢大家的帮助。