仅限于使用PHP标记的帖子

时间:2011-07-23 15:52:23

标签: php api xpath simplexml tumblr

我正在尝试仅获取在tumblr博客上标记的帖子。我可以根据帖子的类型(常规,链接,照片等)获取每个帖子,但相反,我想让每个帖子上都有一个标签。例如,只获取标记为“文件”的帖子

到目前为止,这是我的代码:

<?php
    $xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
    $posts = $xml->xpath("/tumblr/posts/post[@type='photo']");
    foreach($posts as $post) {  

        }
    ?>

    <ul>
        <li> <a href="<?php echo $post['url-with-slug']; ?>">Post 1(PHP should be here)</a></li>
    </ul>

这里是tumblrs API http://www.tumblr.com/docs/en/api/v2

1 个答案:

答案 0 :(得分:3)

首先,您需要在属于foreach循环的花括号中添加标记。否则,您引用的$post对象的范围将不可用,并且会给您一个错误。

这就是我提出的:

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag/..");
foreach($posts as $post) {
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
  </li>
";
}

?>
</ul>

如果您想限制匹配的标签,您可以执行以下操作:

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
  </li>
";
}

?>
</ul>

当然,这有点乱。我不一定是XPath大师,所以应该采用比我想象的更清洁的方式。

由于我没有真正挖掘链接文本的三元组,或者我不知道其中一个或另一个是否总是可用的事实,这应该更具描述性,并回退到URL。 / p>

<ul>
<?php

$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
    if ($post->{'regular-title'}) {
        $slug = $post->{'regular-title'};
    } else if ($post->{'link-text'}) {
        $slug = $post->{'link-text'};
    } else {
        $slug = $post['url-with-slug'];
    }
    echo "
  <li>
   <a href='{$post['url-with-slug']}'>".$slug."</a>
  </li>
";
}

?>
</ul>

修改

并且,您也可能希望匹配TAG元素的整个文本,以便在您需要xml-is-for-noobs时不会对xml之类的内容进行匹配仅标签。 contains()会匹配两者,而下面只会匹配xml

/tumblr/posts/post/tag[text() = 'xml']/..

因此,根据您的评论,如果您要查找标记为events的帖子,但又不想抓住bowling-eventsprevents funother events等标签,等等......,你想要text() = 'events'匹配。另一方面,如果您想要在events节点的文本中与TAG匹配任何内容,请使用contains(text(), 'events')方法。

编辑2

如果您尝试限制结果,请使用position()

(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]

请注意,我的网页上的示例不包含text()匹配,因为没有足够的条目来支持子匹配并且仍然具有效率。但是,这应该有效。

http://jfcoder.com/test/tumblrtest.php

XPath选择属于TAG元素的所有POST个元素,然后选择..的父元素(TAG),它会为您提供一个包含的SimpleXML对象您正在寻找的相关POST元素。

然后,它遍历每个元素,将$post的信息打印到UL元素中。