0

我有一个示例代码:

<?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和端口,但结果为空,如何解决它!

4

2 回答 2

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;
        }
    }
}
于 2013-05-06T09:13:47.853 回答
0

html 源代码包含分隔在两列中的 ip 地址和端口,这就是您的正则表达式不起作用的原因。

于 2013-05-06T08:54:04.913 回答