我有一个示例代码:
<?php
$adr = 'http://www.proxynova.com/proxy-server-list/country-gb/';
$c = file_get_contents($adr);
if ($c){
$regexp = '#<td>(.*?):(\d{1,4})</td>#';
$matches = array();
preg_match_all($regexp,$c,$matches);
print_r($matches);
if (count($matches) > 0){
foreach($matches[0] as $k => $m){
$port = intval($matches[2][$k]);
$ip = trim($matches[1][$k]);
}
}
}
我使用$regex = '#<td>(.*?):(\d{1,4})</td>#';
获取数据包含ip和port,但结果为null,如何修复它!
答案 0 :(得分:3)
你只能在浏览器中正确地看到它,但在源中它实际上是乱码的;你需要这样的东西来解码它:
function decode($str)
{
return long2ip(strtr($str, array(
'fgh' => 2,
'iop' => 1,
'ray' => 0,
)));
}
然后将其与DOMDocument
解决方案一起使用,如下所示:
$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->loadHTML(file_get_contents('http://www.proxynova.com/proxy-server-list/country-gb/'));
$xp = new DOMXPath($doc);
foreach ($xp->query('//table[@id="tbl_proxy_list"]//tr') as $row) {
$ip = $xp->query('./td/span[@class="row_proxy_ip"]/script', $row);
$port = $xp->query('./td/span[@class="row_proxy_port"]/a', $row);
if ($ip->length && $port->length) {
if (preg_match('/decode\("([^"]+)"\)/', $ip->item(0)->textContent, $matches)) {
echo decode($matches[1]) . ':' . $port->item(0)->textContent, PHP_EOL;
}
}
}
答案 1 :(得分:0)
html源代码包含分为两列的ip地址和端口,这就是为什么你的正则表达式没有问题。