如何在不保存内容的情况下搜索网页字符串?

时间:2014-04-05 09:46:45

标签: php search curl preg-match

我知道有一种方法可以做到这一点:

$url = "http://www.google.com/search?q=test";
$str = file_get_contents($url);
preg_match("title/tt\d{7}?/", $str, $matches);
print $matches[0];

但这会读取整个文件,然后扫描匹配。无论如何,我可以减少进行上述匹配过程所需的时间吗?

1 个答案:

答案 0 :(得分:0)

如果您知道网页内部需要查看的位置(即只有前3000个字符左右),您可以使用maxlen中的file_get_contents参数来限制阅读:

file_get_contents($url, false, NULL, -1, 3000);

<强>

<强>更新

如果您不知道在网页中查找哪些内容并希望最小化http请求长度,我为您提供了一个很好的解决方案:))

$url = "www.google.com";
$step = 3000;
$found = false;

$addr = gethostbyname($url);

$client = stream_socket_client("tcp://$addr:80", $errno, $errorMessage);

if ($client === false) {
    throw new UnexpectedValueException("Failed to connect: $errorMessage");
}

fwrite($client, "GET /search?q=test HTTP/1.0\r\nHost: $url\r\nAccept: */*\r\n\r\n");

$str = "";
while(!feof($client)){
    $str .= stream_get_contents($client, $step, -1);

    if(preg_match("/tt\d{7}?/", $str, $matches)){
        $found = true;
        break;
    }
}

fclose($client);


if($found){
    echo $matches[0];
} else {
    echo "not found";
}

<强>说明
$step变量设置为每次迭代读取的字节数,并将"search?q=test"更改为您想要的查询(IMDB标题,根据您的正则表达式判断?:))。 它将完美地完成这项工作。

您还可以在echo $str循环之后执行while,以确切地查看已读取的内容,直到找到所请求的字符串。

我相信这就是你要找的东西。