使用PHP我希望从RIPE IP地址范围的whois记录中获取以descr:
开头的行内容,因此它们应该看起来像这样:
% This is RIPE NCC's Routing Information Service
% whois gateway to collected BGP Routing Tables
% IPv4 or IPv6 address to origin prefix match
%
% For more information visit http://www.ripe.net/ris/riswhois.html
route: 53.0.0.0/8
origin: AS31399
descr: DAIMLER-AS Daimler Autonomous System
lastupd-frst: 2011-12-08 23:18Z 195.66.224.97@rrc01
lastupd-last: 2012-01-25 15:18Z 203.119.76.3@rrc00
seen-at: rrc00,rrc01,rrc03,rrc04,rrc05,rrc07,rrc10,rrc11,rrc12,rrc13,rrc14,rrc15,rrc16
num-rispeers: 98
source: RISWHOIS
所以我应该得到DAIMLER-AS Daimler Autonomous System
。
如何使用最少的代码执行此操作,我在$ whois中有记录。
<?php
$whois = shell_exec('whois -h riswhois.ripe.net ' . $ip);
?>
答案 0 :(得分:5)
您可以使用preg_match()
完成此操作:
$whois = shell_exec('whois -h riswhois.ripe.net ' . $ip);
$result = preg_match('/^descr:\s*(.+)$/m', $matches);
$descr = $matches[1];
注意使用mutliline(m
)修饰符。
答案 1 :(得分:3)
我首先将字符串拆分为一行数组:
$lines = explode("\n", $whois);
然后遍历它们并找到以descr:
开头的那个:
foreach($lines as $l) {
if (strpos($l, 'descr:') === 0) { //We have a winner
$description = trim(substr($l, strlen('descr:')));
}
}
或者,您知道,使用像Tim这样的Regex解决方案。
答案 2 :(得分:2)
像Tim这样的preg_match解决方案是最优的,但只是提出第三个建议供参考,特别是对于较短的字符串。同样的事情可以用:
完成$descr_starts_at = strpos($my_text,"descr:") + 14;
$length = strpos($my_text,"lastupd-frst:") - 1 - $descr_starts_at;
$descr = substr($my_text, $descr_starts_at ,$length);