使用PHP cURL从Reddit检索标题和评级

使用PHP cURL从Reddit检索标题和评级,php,curl,reddit,Php,Curl,Reddit,我试图从reddit主页www.reddit.com上获取标题和收视率,并将它们放入一个数组中。目前,它只检索到一个标题,我不知道该怎么做才能让它检索到页面上的所有标题和收视率 目前我有以下代码: <?php $url = "http://www.reddit.com/"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $var= curl_exec($ch);

我试图从reddit主页www.reddit.com上获取标题和收视率,并将它们放入一个数组中。目前,它只检索到一个标题,我不知道该怎么做才能让它检索到页面上的所有标题和收视率

目前我有以下代码:

<?php
    $url = "http://www.reddit.com/";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $var= curl_exec($ch);
    curl_close($ch);

    $third= stripos($var,'<p class="title"><a class="title " ',0);
    $fourth= stripos($var,'</span></p>',0);

    //echo substr($var,$first,$second-$first);
    echo substr($var,$third,$fourth-$third);
?>

提前感谢。

如果您确实想使用regexp模式,请尝试一下:

<?php
    $url = "http://www.reddit.com/";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $var= curl_exec($ch);
    curl_close($ch);
    preg_match_all('/<a class="title " href="(.{0,255})" tabindex="1"(?:([\sa-z]+)="([a-z]+)")? >(.{0,255})<\/a>&#32;/', $var, $matches);
    print_r($matches[4]);
?>

当我们试图使用curl从另一个站点获取数据时,我们将得到html字符串格式的响应。所以我们必须使用DOMDocument来获取html标记的值。 在这里,我可以成功地获取标题文本,请查看以下代码:

<?php
$url = "http://www.reddit.com";
// Curl call to get heading tags
$ch = curl_init();
//set the url, number of POST vars, POST Data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$responseOfCurl = curl_exec($ch) or die(curl_error());
if( curl_error($ch) )
{
 echo "<br> CURL ERROR: ".curl_error($ch);
}   
curl_close($ch);
//print_r($responseOfCurl);
// To get file src path from html response.
$dom = new DOMDocument();
@$dom->loadHTML($responseOfCurl);
$xpath = new DOMXPath($dom);    
$tags = $xpath->query("//p[@class='title']/a/@href|//p[@class='title']");   
$i=1;
$headingArray = array();
if(!empty($tags))
{
 foreach ($tags as $tag) 
 {    
  $redditHeading = "";
  $redditHeading = trim( $tag->nodeValue ); 
  $headingArray[].=$redditHeading;
 } 
  print_r($headingArray);
}
?>
在这里,我进行查询以获得标题文本,如下所示: 如果您查看reddit.com页面的查看源代码,您会发现标题文本的格式如下:

<p class='title'>
 <a class='title' href='abc.com'>heading text</a>
</p>
所以我做了以下查询作为标记classname和标记classname, //p[@class='title']/a/@href |//p[@class='title']

$headingArray在此数组中,您将获得reddit.com的所有标题。 要进行交叉检查,请从reditt.com中放入一个标题并在此数组中搜索


因此,您必须进行另一个查询以从html标记中获取评级文本。

是的,您创建了一个数组,并在该数组中存储相应的标题和评级。 或者,您必须创建这样的查询组合,以获取评级和标题的文本。
并将其存储在阵列中。

为什么不使用reddit API?@Fabian我也不知道如何做到这一点,但我更愿意不使用reddit API。请问您为什么不想使用该API?你的问题可以归结为获取包含所有你想要的内容的格式正确且易于访问的json或xml,如果你喜欢我从未使用过的正则表达式的话。谢谢但有一件事,我如何将每个标题的评分添加到数组中(可能是2d数组)?我希望最终能够使用其评分对标题进行排序,投票最多的标题位于顶部。您必须更改正则表达式或创建新的正则表达式,并与标题进行比较。首先检查这两个数组是否具有相同的长度,然后可以轻松地基于这两个数组创建一个新数组,其中键作为评级,值作为标题。然后对其使用ksort将按键对数组进行排序。好了。我正在使用下面的方法来获得收视率:'/.-?[0-9]{1,10}\s*/'它是有效的,但是收视率数量有限,有28个标题,只有24个收视率。我也不确定如何链接这两条数据。这是因为有些标题没有评级——有些赞助商在那里。我尝试使用以下查询获得评级://div[@class='score unvetted'],它似乎没有获得所有评级,我真的不确定如何链接标题和评级。是否可以将它与头一起放入数组中?