仅限于标记为PHP的帖子。

3

我正在尝试仅获取标记在Tumblr博客上的帖子。我可以根据帖子的类型(常规、链接、照片等)获取每个帖子,但我想获取每个带有特定标记的帖子。例如,仅获取标记为“file”的帖子。

以下是我的代码:

<?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>

以下是 Tumblr 的 API http://www.tumblr.com/docs/en/api/v2

1个回答

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的功能。
<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'匹配。另一方面,如果您确实想匹配TAG节点文本中包含events的任何内容,请使用contains(text(),'events')方法。

编辑2

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

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

注意,我的网页示例没有包括text()匹配,因为没有足够的条目支持子匹配并保持生产力。但是,那应该是可行的。

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

XPath选择所有属于POST元素的TAG元素,然后选择该TAG元素的父级(..),这将给您一个包含相关POST元素的SimpleXML对象。接下来,它遍历每个元素,将$post的信息打印到UL元素中。

我有点理解这是如何工作的。但我不知道如何更改应该出现在帖子中的标签?因为对于我的客户,我需要获取所有标记为“事件”的帖子...例如,我曾经获取所有标记为文件的帖子... - kdevs3
那就是 contains() 部分。从听起来的意思来看,你会有一个包含语句,是 /tumblr/posts/post/tag[contains(text(),'events')]/.. - Jared Farrish
糟糕,在上面的注释中我忘记了加上尾随的 /.. 来选择父级(我已经修复了)。 - Jared Farrish
我该如何限制只显示5个列表帖子?我猜这可以通过CSS完成。 - kdevs3
你可以使用PHP的自增值($i++),或者使用XPath的position()(或者使用CSS,正如你所指出的)。请参考我的编辑。 - Jared Farrish
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接