在php中使用正则表达式获取数据时出错

时间:2013-05-06 08:47:36

标签: 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和port,但结果为null,如何修复它!

2 个答案:

答案 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地址和端口,这就是为什么你的正则表达式没有问题。