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とポートを含むデータを取得するために使用しましたが、結果がnullです。修正方法!

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 に答える