我知道有一种方法可以做到这一点:
$url = "http://www.google.com/search?q=test";
$str = file_get_contents($url);
preg_match("title/tt\d{7}?/", $str, $matches);
print $matches[0];
但这会读取整个文件,然后扫描匹配。无论如何,我可以减少进行上述匹配过程所需的时间吗?
答案 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
,以确切地查看已读取的内容,直到找到所请求的字符串。
我相信这就是你要找的东西。