2013-05-06 3 views
0

У меня есть пример код:Ошибки при получении данных при использовании регулярных выражений в PHP

<?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-порт, но результат нулевой, как это исправить!

+2

Вы проверили исходный код HTML? – zerkms

ответ

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; 
     } 
    } 
} 
+0

О, просто 'long2ip()', стыдно за меня :-( – zerkms

+0

@zerkms .... :-) –

0

Исходный код html содержит ip-адреса и порты, разделенные в двух столбцах, поэтому ваше регулярное выражение do wor't worK.

Смежные вопросы